首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >iOS_多线程:函数等待异步任务执行完毕后返回(异步实现同步效果)

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

作者头像
mikimo
发布2022-07-20 14:10:52
发布2022-07-20 14:10:52
3.2K0
举报
文章被收录于专栏:iOS开发~iOS开发~

希望异步实现同步场景

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

实现方式如下几种:

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

代码语言: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开发技巧: 将异步方法封装成同步方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 希望异步实现同步场景
  • 实现方式如下几种:
    • 一、使用信号量 diapatch_semaphore
    • 二、使用派发组 dispatch_group
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档