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

2022-07-20 14:10:52 浏览数 (1)

希望异步实现同步场景

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

实现方式如下几种:

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

代码语言:javascript复制
- (void)deviceWithKey:(NSString *)key result:(void(^)(NSString *value))complete {
  NSDictionary *dic = @{@"mac1":@"device1"};
  complete(dic[key]);
}

一、使用信号量 diapatch_semaphore

代码语言:javascript复制
- (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

代码语言:javascript复制
- (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 人点赞