美文网首页
IOS 异步变同步

IOS 异步变同步

作者: yitez | 来源:发表于2020-04-22 16:50 被阅读0次

很多时候我们在通过方法获取某个属性的时候,会发现很多方法是异步的,block虽然好用,但是过多的嵌套难免会降低代码的可读性。比如

  [[PHImageManager defaultManager] requestAVAssetForVideo:self
                                                  options:options
                                            resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary<NSString *, id> *info) {
                                          //拿到avAsset后,do some thing
          
 }];

跟相册打交道的PHAsset下尤其常见,这类方法虽然是异步,但是返回结果很快,我们就希望能变成同步返回方便整理代码结构。
这里使用锁的方式,

- (AVAsset *)videoAssert
{
  __block AVAsset *assert = nil;
  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  PHVideoRequestOptions *const options = [PHVideoRequestOptions new];
  options.version = PHVideoRequestOptionsVersionCurrent;
  options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
  options.networkAccessAllowed = YES;
  [[PHImageManager defaultManager] requestAVAssetForVideo:self
                                                  options:options
                                            resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary<NSString *, id> *info) {
                                              assert = avAsset; 
                                              dispatch_semaphore_signal(semaphore);  //获取block结果后唤醒
                                            }];
  dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 500 * NSEC_PER_MSEC));    //加锁,不让方法结束
  return assert;
}

通过这种方式,我们就可以减少block的嵌套。

相关文章

  • iOS异步变同步

    另外一种写法:使用信号量

  • IOS 异步变同步

    很多时候我们在通过方法获取某个属性的时候,会发现很多方法是异步的,block虽然好用,但是过多的嵌套难免会降低代码...

  • gennerator 函数

    模拟异步变同步

  • iOS-14 线程基础

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

  • iOS 多线程基础

    转自:iOS 多线程基础 - 简书 多线程同步和异步的区别?IOS中如何实现多线程的同步? 异步:可以同时执行多条...

  • iOS中的同步&异步 并行&串行

    以下是我个人对 iOS中的同步&异步 并行&串行 的理解,有不对的地方欢迎指正。 同步 异步 控制的是 “是否创建...

  • iOS 多线程基本概念

    iOS 多线程基本概念 容易混淆的几点 同步与异步 同步:不会开启新线程异步:可以开启新线程(但不代表一定会开启新...

  • iOS gcd看我就够了

    gcd是iOS中多线程的一种技术,下面我们来看看gcd的用法 同步&异步 同步 同步执行:字面意思,同步执行就是执...

  • UNIX 的5种IO模型介绍

    IO模型同步、异步、阻塞、非阻塞socket阻塞与非阻塞,同步与异步 同步和异步 同步/异步主要针对C端-同步就像...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

网友评论

      本文标题:IOS 异步变同步

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