美文网首页
iOS 转换异步block为同步方式运行

iOS 转换异步block为同步方式运行

作者: 今年27 | 来源:发表于2016-12-06 15:20 被阅读1919次

在iOS5以后,许多API将只提供block版本,所以调用这些API就总是以异步方式运行的了。但有时候我们不想使用异步方式,例如我们想要调用函数后立刻获取结果值的时候。

在旧的方式中,我们无法使用NSCondition做这件事:

__block NSCondition *condition = [[NSCondition alloc] init];

__block ALAssetsGroup *ret = nil;

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {

[condition lock];

ret = group;

[condition signal];

[condition unlock];

};

ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {

[condition lock];

ret = nil;

[condition signal];

[condition unlock];

};

NSUInteger groupTypes = ALAssetsGroupSavedPhotos;

[self.assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:failureBlock];

[condition lock];

[condition wait];

[condition unlock];

return ret;

我们在block的结尾处等待一个信号量。

更简单的办法是使用dispatch_semaphore_t:

dispatch_semaphore_t sema = dispatch_semaphore_create(0);  //创建信号量

__block ALAssetsGroup *ret = nil;

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {

ret = group;

dispatch_semaphore_signal(sema);  //关键点,在此发送信号量

};

ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {

ret = nil;

dispatch_semaphore_signal(sema);  //关键点,失败时发送

};

NSUInteger groupTypes = ALAssetsGroupSavedPhotos;

[self.assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:failureBlock];

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);  //关键点,在此等待信号量

return ret;

相关文章

  • iOS 转换异步block为同步方式运行

    在iOS5以后,许多API将只提供block版本,所以调用这些API就总是以异步方式运行的了。但有时候我们不想使用...

  • iOS 转换异步block为同步方式运行

    使用dispatch_semaphore_t 实现 dispatch_semaphore_t sema = dis...

  • GCD 入门

    同步,异步:同步是指:当一个 block 被添加到 queue 时,会阻塞当前运行的线程,直到 block 中的内...

  • iOS网络NSURLConnection和NSURLSessio

    HTTP通信过程 NSURLConnection发送网络请求 block 方式 发送同步请求发送同步请求 发送异步...

  • iOS-14 线程基础

    参考 ios的线程和同步异步操作 - 简书线程 同步异步 Timer 等使用 本文主要从 1、 ios三种创建方式...

  • RN与原生通信

    1.RCTResponseSenderBlock这个是一个 异步回调。 不是同步的。跟iOS block 不一样...

  • JavaScript 异步循环 - async/await 的使

    如何以顺序或并行方式运行异步循环? 在对循环进行异步处理之前,我想提醒您如何编写经典的同步循环。 同步循环 很久以...

  • dispatch queue.h

    版本:iOS13.5 queue.h dispatch其他文件通道 同步和异步的区别当运行到dispatch_as...

  • 前台数据传输

    数据提交 同步提交 方式一: 方式二: 方式三: 方式四: 异步提交 方式一: 方式二: 异步和&同步比较 for...

  • iOS多线程知识点梳理

    iOS多线程实现方式 pthread NSThread (三种方式创建) GCD 同步&异步针对的主体是任务,以t...

网友评论

      本文标题:iOS 转换异步block为同步方式运行

      本文链接:https://www.haomeiwen.com/subject/lkjrmttx.html