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