一.問題
-(CLPlacemark*)getStartplacemark
?????{
?????????__block CLPlacemark* start;
?????????[ self.geoCoder geocodeAddressString:_SourceText.text completionHandler:^(NSArray*placemarks, NSError*error) {
?????????????CLPlacemark *startPlaceMark=[placemarks firstObject];
?????????????start=startPlaceMark;
??????????????????????}];
?????????NSLog(@"%@",start);//這里打印出的是一個 null,是因為 block 是異步的,所以會先走下面的 return,
?????????returnstart;
}
二.解決方法
- (CLPlacemark*)getStartplacemark
{
//先創建一個semaphore
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
? ? __block CLPlacemark* start;
? ? [self.geoCoder geocodeAddressString:_SourceText.text completionHandler:^(NSArray *placemarks, NSError *error) { ? ? ?
? ? ? CLPlacemark *startPlaceMark = [placemarks firstObject];
? ? ? ? start = startPlaceMark;
?????? //發出已完成的信號
????????dispatch_semaphore_signal(semaphore);
? ? }];
????//等待執行,不會占用資源
????dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
? ? return start;
}