美文网首页ios积累
怎样等待 assetForURL: 的block 调用(bloc

怎样等待 assetForURL: 的block 调用(bloc

作者: reinventjianshu | 来源:发表于2015-03-23 12:23 被阅读2123次

          - (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

    相关文章

      网友评论

      • 58cb860debdd:把wait加入异步线程后,下面的方法就直接执行了
      • 超_iOS:按照楼主的来写并没用啊,wait的时候是0,他会一直等待下去啊?求楼主或大神解答
        WTG:@李二超 楼主的方法是在子线程中执行、不是在主线程、你的在主线程肯定会造成死锁
      • 超_iOS:把这些GCD写到for循环中不会出问题吗??求大神解答
        超_iOS:@李二超 但保险起见建议还是不要这样做,请问为什么非要加入队列啊

      本文标题:怎样等待 assetForURL: 的block 调用(bloc

      本文链接:https://www.haomeiwen.com/subject/tikgxttx.html