2011-07-21 15 views
6

Có thể sử dụng các đối tượng CLLocation làm các khóa trong từ điển không? Khi tôi thử điều này, [dictionary objectForKey: clLocationObj] luôn trả về nil ngay cả khi có các khóa CLLocation đã được chèn với chính xác cùng vĩ độ và kinh độ. Tôi có thể làm gì sai?sử dụng các đối tượng CLLocation làm khóa trong từ điển

 for (Location *location in someArray) { 
       CLLocation *locationKey = [[CLLocation alloc] initWithLatitude:[location.latitude doubleValue] longitude:[location.longtitude doubleValue]]; 
       LocationAnnotation *annotationAtLocation = [self.uniqueLocations objectForKey:locationKey]; 
       if (annotationAtLocation == nil) 
        NSLog(@"this is always nil"); 
     } 

Tôi biết từ việc gỡ lỗi của mình rằng có nhiều đối tượng Vị trí có cùng vĩ độ và kinh độ trong someArray.

Trả lời

6

CLLocation dường như không ghi đè isEqual để thực hiện so sánh nội dung thực tế, thay vào đó nó so sánh bình đẳng dựa trên nhận dạng đối tượng. Do đó, không khôn ngoan để sử dụng nó làm khóa trong từ điển, trừ khi bạn luôn truy cập nó bằng cách sử dụng cùng một đối tượng chính xác.

Các giải pháp bạn đã được mô tả trong một chú thích là cách giải quyết khá tốt cho nhiều tình huống:

tôi đã kết thúc chuyển đổi các đối tượng CLLocationCoordinate2D thành một NSValue và sử dụng đó là chìa khóa vào từ điển.

2

Hoàn toàn được phép sử dụng CLLocation làm khóa cho từ điển, không có vấn đề gì với điều đó. Lý do bạn nhận được nil là do không có giá trị nào được liên kết với khóa, hãy kiểm tra nơi bạn điền từ điển.

Giới thiệu về bội số của bạn CLLocation phím, mỗi khi bạn đặt đối tượng cho khóa đã tồn tại trong từ điển, giá trị trước đó sẽ được gửi một thông báo release và thông báo mới sẽ thay thế. Vì vậy, nếu bạn có nhiều vị trí để lưu trữ và một số vị trí bằng nhau, bạn nên tìm một loại khác làm khóa cho từ điển.

+0

sao bạn giải quyết điều đó không? –

+1

Tôi đã làm theo cách khác. Lý do tại sao CLLocation không hoạt động tốt với tôi là nó có nhiều thông tin hơn chỉ là lat/long trong đó, vì vậy so sánh 2 CLLocations với cùng một lat/long sẽ không dẫn đến kết quả trùng khớp. Tôi đã kết thúc việc chuyển đổi đối tượng CLLocationCoordinate2D thành một NSValue và sử dụng nó làm khóa cho từ điển. –

5

NSValueMapKitGeometryExtensions loại trên NSValue trong khuôn khổ MapKit

//to set 
NSValue *locationValue = [NSValue valueWithMKCoordinate:location.coordinate]; 
[dictionary setObject:object forKey:locationValue]; 

//to get 
NSValue *coordinateValue = dictionary[locationValue]; 
CLLocationCoordinate2D coordinate = [coordinateValue MKCoordinateValue];