怎样等待 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容