?? ???- (void)assetForURL:(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock??failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
當我們用assetForURL:獲取相冊的圖片時,我們只能通過回調才能獲得image,也就是說你想對獲得的image做什么操操作,只能把代碼放在assetForURL:的回調中。
但像下圖中的需求,我們需要在for循環(huán)完,所有圖片取出后再做處理,回調中我們只是不斷把取到的image暫存到toUploadImageArray數(shù)組中。接下來我們在for循環(huán)結束后判斷toUploadImageArray是否為空。

是否為空呢?是的,全部為空,這是因為block的回調全部為異步任務,當for循環(huán)體執(zhí)行完畢,馬上就會執(zhí)行下面的代碼,block的回調被放在了本線程的最后才會執(zhí)行,所以你什么都取不到。
解決這個問題就要用到GCD,代碼看下圖

通過dispatch_semaphore_wait信號量控制,使得程序只有執(zhí)行完了回調,獲得sema信號后才會執(zhí)行dispatch_semaphore_wait后面的代碼。
經過測試,這里即使不把assetForURL:加入串行異步任務,僅用信號量控制也能實現(xiàn)同步,但保險起見建議還是不要這樣做。
注意:
還有同學可能會遇到這樣的問題,在加入上述同步控制后,把主線程卡死了,這時我們只需要把信號控制加入到dispatch_async中問題應該就可以解決了

受自身水平限制,文中難免會有疏漏,如有錯誤敬請指出,轉載請注明出處,謝謝