2010-09-27 15 views
8

Tôi gặp sự cố với getDistanceFrom và distanceFromLocation. getDistanceFrom không được chấp nhận iOS 4.1 và distanceFromLocation không có sẵn trong 3.1.3, làm cách nào để khắc phục sự cố này.getDistanceTừ khoảng cách VsFromLocation

Có ai khác gặp phải vấn đề này không?

Mã của tôi vào lúc này là:

CLLocationDistance kilometers; 
     if ([currentLocation respondsToSelector: @selector(distanceFromLocation:)]) 
     { 
      kilometers = [currentLocation distanceFromLocation:previousLocation]/1000; 
     } 
     else 
     { 
      //kilometers = [currentLocation getDistanceFrom:previousLocation]/1000; 
      kilometers = [currentLocation performSelector: @selector(getDistanceFrom:) withObject: previousLocation]/1000; 
     } 

Tùy thuộc vào iOS Tôi biên dịch với tôi nhận được 'toán hạng không hợp lệ để nhị phân' trên dòng:

kilometers = [currentLocation distanceFromLocation:previousLocation]/1000; 
      kilometers = [currentLocation performSelector: @selector(getDistanceFrom:) withObject: previousLocation]/1000; 

Kính trọng, Stephen

Trả lời

14

Có một số blog post bởi Cédric Luthi có giải pháp khá tốt cho điều này.

Nói tóm lại, bạn cần phải nhập đoạn mã sau vào main.m của bạn và chắc chắn rằng để #import <objc/runtime.h>:

Method getDistanceFrom = class_getInstanceMethod([CLLocation class], @selector(getDistanceFrom:)); 
class_addMethod([CLLocation class], @selector(distanceFromLocation:), method_getImplementation(getDistanceFrom), method_getTypeEncoding(getDistanceFrom)); 

Sau đó bạn có thể sử dụng distanceFromLocation: trên bất kỳ hệ điều hành.

+0

Giải pháp tuyệt vời! Cám ơn bạn đã khiến tôi chú ý tới việc này! – Jann

+0

Nó trả về sản phẩm nào ... Xin vui lòng giúp đỡ. Tôi đang kiểm tra trên 3.0 Cảm ơn trước – Sohail

+0

Bắt đầu câu hỏi mới. –

11

Tôi sử dụng phương pháp của riêng mình. Nó là MUCH nhanh hơn và có thể được sử dụng trên cả iOS 3.x và iOS 4.x.

 

- (double)distanceFrom:(CLLocationCoordinate2D)locationA to:(CLLocationCoordinate2D)locationB 

{ 
    double R = 6368500.0; // in meters 

    double lat1 = locationA.latitude*M_PI/180.0; 
    double lon1 = locationA.longitude*M_PI/180.0; 
    double lat2 = locationB.latitude*M_PI/180.0; 
    double lon2 = locationB.longitude*M_PI/180.0; 

    return acos(sin(lat1) * sin(lat2) + 
       cos(lat1) * cos(lat2) * 
       cos(lon2 - lon1)) * R; 
} 
 
+0

Điều này thật tuyệt vời - cảm ơn bạn! – mpemburn

+0

Tuyệt vời! -- cảm ơn! –

+0

Có thực sự nhanh hơn không? Tôi không nhận thấy nó nhanh hơn phương thức .distanceFromLocation. Sự khác biệt duy nhất là các giá trị kết quả khá khác nhau. – yerassyl

Các vấn đề liên quan