2010-11-16 112 views
0

我在CLLocationManager回调中遇到了一些问题
等待异步回调的最佳方式是什么?等待异步回调 - Objective-C

这里是我基本上要做到:

 

- (NSString *)getCurrentCity 
{ 
     [self.locationManager startUpdatingLocation]; 
     // Wait for coordonate in callbacks 
     self.geocoder = [MKReverseGeocoder alloc] initWithCoordonate:self.newCoordonate]; 
     [self.geocoder start]; 
     // Wait for information with MKReverse callbacks 
     return self.currentCity; 
} 
// Callbacks methods of MKReverseGeocoder and CLLocationManager 
- (void)locationManager:(CLLocationManager *)manager 
    idUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
     CLLocationCoordinate2D newCoordonate = newLocation.coordinate; 
     self.currentCoordonate = &newCoordonate; 
} 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder 
     didFindPlacemark:(MKPlacemark *)placemark 
{ 
     self.currentCity = placemark.locality; 
} 

凡self.currentCity和self.newCoordonate是我CLASSE的attribut。

我尝试了一些技巧,如线程和/或同步,但我没有管理它在所有完成之前不返回。

问候

+0

self.currentCoordonate =&newCoordonate;这让我害怕了很多级别 – 2010-11-16 16:26:25

+0

异步回调的重点在于您无需等待。 – koo 2010-11-16 17:18:17

回答

2

你不要等待它完成,你处理的更新时异步locationmanager:didUpdatefromLocation:被调用。这就是异步编程的要点。 :)

+0

我同意;事实上 。我想调用一个方法来通过异步回调传递一个信息。如果我能通过它同步,我会对我很好,我认为 – klefevre 2010-11-16 16:34:10

+0

一种方法可能是编写一个包装类'GPSManager'或类似的东西。它将处理'CLLocationManager'的东西,并公开两个属性,如'positionAvailable'和'currentPosition',以用于其他代码。 – 2010-11-16 16:40:03

+0

我已经试过,但它的相同点...如何知道我的财产是否已经改变?它也是异步工作的。 – klefevre 2010-11-16 16:44:47

1

无论何时您阻止主线程,您的应用程序都会变得无响应(最好),并且会被系统抛弃(即在最坏的情况下被杀)。

对于异步API,最简单的模式是隔离线程或排队的全部或用于使主线程工作的任何机制转换为根据需要将rendezvousing转换回主线程的类。

举一个例子,看看NSFileHandle。它有一个readInBackgroundAndNotify:方法。在使用时,NSFileHandle实例会在内部创建一个线程,使用该线程读取所需的任何内容,然后使用类似performSelectorOnThread:的内容将通知发送到线程 - 通常是主线程 - 首先调用readInBackgroundAndNotify:

通过这样做,该类的用户不必处理线程,但该类不会阻止主事件循环。


BTW:

{ 
    CLLocationCoordinate2D newCoordinate = newLocation.coordinate; 
    self.currentCoordonate = &newCoordinate; 
} 

这是完全错误的,肯定火的方式来保证崩溃或不确定的行为。 &newCoordinate给出了地址newCoordinate,但该结构在堆栈中。只要该方法返回,该结构的内容即将被丢弃。

+0

我这样做是因为我声明了CLLocationCoordinate2D的指针。所以CLLocationCoordinate2D * newCoordinate =&newCoordinate;完美工作 – klefevre 2010-11-16 17:03:10

+1

@ KL94:是的,这是一个指针,当然,您的代码已被Objective-C的类型系统接受。除了确保你的类型匹配之外,还有更多工作程序。将指针指向一个自动变量并将其存储在一个实例变量中是未定义的行为 - 这是一个等待发生的错误或崩溃。问自己要找到正确的解决方案:*为什么*是那个实例变量的一个指针?如果有理由需要,那是什么原因?你需要围绕这个约束设计你的代码。否则,不要让它成为指针。 – Chuck 2010-11-16 17:58:19