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

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