主线程调dispatch_semaphore_wait的坑

昨天发现一个很有意思平时也很容易出错的bug,今天来总结下。
场景是这样的:方法A中异步调用一个第三方的上传图片方法B(此方法也是异步的),并且方法A在当前线程调用了dispatch_semaphore_wait(semp, DISPATCH_TIME_FOREVER),要等到方法B的回调时,才会调dispatch_semaphore_signal,如下图

18B93DCC-F884-41E7-8059-423B91F8FCA7.png

因为我们并不能控制uploadImages调用的线程,所以如果uploadImages在主线程调用,uploadImages中有在当前线程永久的等待通知,而第三方uploadImage的回调是在主线程的话,回调completeBlock是永远不会执行,那么就永远不会发送信息量通知,导致主线程永久等待。

总结

所以当我们不能控制接口调用线程时,最好不要在接口的当前线程永久等待信号量。

你可能感兴趣的:(主线程调dispatch_semaphore_wait的坑)