美文网首页
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 异步变同步

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