是否可以使用信号量等待异步请求(比如NSURLSessionDataTask
)。
有很多建议声称同步网络很糟糕,但我不认为这是拒绝同步请求的理由,特别是在他们完成的情况下后台主题。
同步请求(在后台线程/队列中)具有不需要回调嵌套的好处。
https://stackoverflow.com/a/31563134/466604中的答案只显示了实现这一目标的方法,但它带有隐含的劝阻。 (以及来自https://devforums.apple.com/thread/9606?tstart=0)的其他沮丧
我的问题是,如果这些同步请求发生在后台线程中,主要是为了避免嵌套回调,是否有必要阻止这种沮丧。
答案 0 :(得分:3)
不,不行。不要这样做。
iOS可能会在此过程中终止您的应用。此外,请查看回调,因为它们是串行执行的下一步。
处理器需要这些周期来做其他事情,不要欺负!
<强> INSIGHT:强>
正如@EricD所说,如果您的执行由于某种原因失败,那么该线程将丢失,直到您退出应用程序和O.S.声称它回来了。
该线程是一种宝贵的资源,不能浪费太多 在移动操作系统中比iOS更有价值。
iPhone的处理器不像现在的桌面处理器或GPU处理器那样强大,可以构建多达数十万个线程。
如果你使用信号量,你醒来后会在一段时间后询问该线程,如果条件没有达到,那么你再次进入睡眠状态。这通常是在ms时间内,但仍然是处理器专用于某些无用的东西。
更清晰
当你定义一个回调时,好像你要睡觉而你对别人说。
不要打电话给我,我准备好的时候会打电话给你。
相反,使用信号量就像:
如果你打电话给我1000次,我会问我是否准备好了
在这种情况下,这种情况很明显......你通常需要一段时间才能醒来并再次入睡。 这浪费了处理器时间
请记住,在最好的情况下,您使用的信号量会使线程进入休眠状态一段时间,然后再次询问是否确定继续。
如果不是这种情况,那么此线程正在使用分配给它的所有处理器周期来询问您是否可以继续,即该线程中的100%CPU使用率评估只是一个条件。