如何先執(zhí)行block中的代碼后在執(zhí)行下面的代碼

一.問題

-(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

{

//先創(chuàng)建一個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;

?????? //發(fā)出已完成的信號

????????dispatch_semaphore_signal(semaphore);

? ? }];

????//等待執(zhí)行,不會占用資源

????dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

? ? return start;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容