怎样等待 assetForURL: 的block 调用(bloc
2015-03-23 本文已影响2123人
reinventjianshu
- (void)assetForURL:(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
当我们用assetForURL:获取相册的图片时,我们只能通过回调才能获得image,也就是说你想对获得的image做什么操操作,只能把代码放在assetForURL:的回调中。
但像下图中的需求,我们需要在for循环完,所有图片取出后再做处理,回调中我们只是不断把取到的image暂存到toUploadImageArray数组中。接下来我们在for循环结束后判断toUploadImageArray是否为空。
![](https://img.haomeiwen.com/i291722/bee44f5a0bb2b52d.png)
是否为空呢?是的,全部为空,这是因为block的回调全部为异步任务,当for循环体执行完毕,马上就会执行下面的代码,block的回调被放在了本线程的最后才会执行,所以你什么都取不到。
解决这个问题就要用到GCD,代码看下图
![](https://img.haomeiwen.com/i291722/d643c94e055bdd34.png)
通过dispatch_semaphore_wait信号量控制,使得程序只有执行完了回调,获得sema信号后才会执行dispatch_semaphore_wait后面的代码。
经过测试,这里即使不把assetForURL:加入串行异步任务,仅用信号量控制也能实现同步,但保险起见建议还是不要这样做。
注意:
还有同学可能会遇到这样的问题,在加入上述同步控制后,把主线程卡死了,这时我们只需要把信号控制加入到dispatch_async中问题应该就可以解决了
![](https://img.haomeiwen.com/i291722/fa46c0ccf9585e97.png)
受自身水平限制,文中难免会有疏漏,如有错误敬请指出,转载请注明出处,谢谢