iOS_多线程:函数等待异步任务执行完毕后返回(异步实现同步效果)

希望异步实现同步场景

在开发中我们经常会遇到异步方法,在设计程序逻辑的时候有些操作依赖于异步的回调结果,有时候我们不得不把一个原本内聚的逻辑通过代理或者回调的方式打散开来,这样作它打乱了我们代码顺序执行的流程。如果这个方法是同步的就好了
如:一个需要用户等待的过程(就是有没有阻塞主线程,对用户而言没区别),有很多异步任务需要有序执行,这时就没必要在异步回调后再通知外层继续。直接写成同步的就好了。

实现方式如下几种:

假设:有这么一个异步任务

- (void)deviceWithKey:(NSString *)key result:(void(^)(NSString *value))complete {
  NSDictionary *dic = @{@"mac1":@"device1"};
  complete(dic[key]);
}

一、使用信号量 diapatch_semaphore

- (NSString *)syncFindDevice1 {
  NSString __block *result;
  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // 
  [self deviceWithKey:@"mac1" result:^(NSString *value) {
    result = value;
    dispatch_semaphore_signal(semaphore); //
   }];
  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //
  return result;
}

二、使用派发组 dispatch_group

- (NSString *)syncFindDevice2 {
  NSString __block *result;
  dispatch_group_t group = dispatch_group_create(); //
  dispatch_group_enter(group); //
  [self deviceWithKey:@"mac1" result:^(NSString *value) {
    result = value;
    dispatch_group_leave(group); //
  }];
  dispatch_group_wait(group, DISPATCH_TIME_FOREVER); //
  return result;
}

参考:
iOS开发技巧: 将异步方法封装成同步方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫探科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值