IOS 异步变同步

2020-04-22  本文已影响0人  yitez

很多时候我们在通过方法获取某个属性的时候,会发现很多方法是异步的,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的嵌套。

上一篇 下一篇

猜你喜欢

热点阅读