如何 使 block 中代码先运行后在执行下面的代码

超越自我TK 2015-08-13 01:44:47
-(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,
return start;
}
求大神解答
...全文
496 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gabriel_code 2017-06-21
  • 打赏
  • 举报
回复
在主线程下,实行线程锁会直接锁死,后面的代码会全部不再执行
人散风中 2015-11-09
  • 打赏
  • 举报
回复
你创建queue的作用是什么?我也在网上看到了很多这个方法,但是我用的时候报错了。也不理解创建了一个queue但是一直没使用,为什么都还写上去了。
超越自我TK 2015-08-16
  • 打赏
  • 举报
回复
- (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; } 其实我想要的是这样的效果,二楼回复的方法也可用,但是饶了一圈又回去了,我想要直接返回start的值
超越自我TK 2015-08-16
  • 打赏
  • 举报
回复
引用 1 楼 hekunhotmail 的回复:
-(void )getStartplacemark resultBlock:(void(^)(CLPlacemark *obj))block { __block CLPlacemark* start; [ self.geoCoder geocodeAddressString:_SourceText.text completionHandler:^(NSArray *placemarks, NSError *error) { CLPlacemark *startPlaceMark=[placemarks firstObject]; start=startPlaceMark; if(block) block(start); }]; NSLog(@"%@",start);//这里打印出的是一个 null,是因为 block 是异步的,所以会先走下面的 return, }
大神能不能给详细解释下这个block的用法,菜鸟还是不懂(⊙o⊙)…
SingSmiler 2015-08-13
  • 打赏
  • 举报
回复
-(void )getStartplacemark resultBlock:(void(^)(CLPlacemark *obj))block { __block CLPlacemark* start; [ self.geoCoder geocodeAddressString:_SourceText.text completionHandler:^(NSArray *placemarks, NSError *error) { CLPlacemark *startPlaceMark=[placemarks firstObject]; start=startPlaceMark; if(block) block(start); }]; NSLog(@"%@",start);//这里打印出的是一个 null,是因为 block 是异步的,所以会先走下面的 return, }

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧