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

本文探讨了在开发中如何将异步操作转化为同步场景,通过信号量dispatch_semaphore和派发组dispatch_group两种方法,使代码逻辑更清晰,避免回调带来的代码碎片化问题。
摘要由CSDN通过智能技术生成

希望异步实现同步场景

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

实现方式如下几种:

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

- (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;
}
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值