怎样等待 assetForURL: 的block 调用(block的同步问题)


      - (void)assetForURL:(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock  failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;

当我们用assetForURL:获取相册的图片时,我们只能通过回调才能获得image,也就是说你想对获得的image做什么操操作,只能把代码放在assetForURL:的回调中。

但像下图中的需求,我们需要在for循环完,所有图片取出后再做处理,回调中我们只是不断把取到的image暂存到toUploadImageArray数组中。接下来我们在for循环结束后判断toUploadImageArray是否为空。

异步

是否为空呢?是的,全部为空,这是因为block的回调全部为异步任务,当for循环体执行完毕,马上就会执行下面的代码,block的回调被放在了本线程的最后才会执行,所以你什么都取不到。

解决这个问题就要用到GCD,代码看下图

同步

通过dispatch_semaphore_wait信号量控制,使得程序只有执行完了回调,获得sema信号后才会执行dispatch_semaphore_wait后面的代码。

经过测试,这里即使不把assetForURL:加入串行异步任务,仅用信号量控制也能实现同步,但保险起见建议还是不要这样做。

注意:

还有同学可能会遇到这样的问题,在加入上述同步控制后,把主线程卡死了,这时我们只需要把信号控制加入到dispatch_async中问题应该就可以解决了

受自身水平限制,文中难免会有疏漏,如有错误敬请指出,转载请注明出处,谢谢

参考:

stackoverflow : Wait for assetForURL blocks to be completed

你可能感兴趣的:(怎样等待 assetForURL: 的block 调用(block的同步问题))