【问题标题】:Synchronous HTTP Requests in Swift [closed]Swift 中的同步 HTTP 请求 [关闭]
【发布时间】:2016-02-11 14:33:38
【问题描述】:

例如使用信号量等待异步请求(比如NSURLSessionDataTask)是否可以。

有很多建议声称同步网络不好,但我不认为这是拒绝同步请求的理由,尤其是当它们在后台线程中完成时。

同步请求(在后台线程/队列中)具有不需要嵌套回调的好处。

https://stackoverflow.com/a/31563134/466604 中的答案仅显示了实现此目的的方法,但它带有隐含的气馁。 (以及来自https://devforums.apple.com/thread/9606?tstart=0 的其他劝阻)

我的问题是,考虑到这些同步请求发生在后台线程中,主要是为了避免嵌套回调,是否有必要阻止这种劝阻。

【问题讨论】:

标签: ios multithreading swift


【解决方案1】:

不,这不好。不要这样做。

iOS 甚至可能会在此过程中杀死您的应用。此外,请查看回调,因为它们是串行执行的下一步。

处理器需要这些周期来做其他事情,不要欺负人

洞察:

正如@EricD 所说,如果您的执行由于某种原因失败,则该线程将丢失,直到您退出应用程序和操作系统。索回。

该线程是一种宝贵的资源,不能浪费太多 在 iOS 等移动操作系统中更有价值。

iPhone 的处理器不如现在的 Desktop 处理器或 GPU 处理器强大,后者可以构建多达数十万个线程。

如果你使用信号量,你会在一段时间后醒来询问那个线程,如果条件没有得到满足,那么你会再次进入睡眠状态。这通常在 ms 时间内,但仍然是处理器专用于无用的一些时间。

更清晰

当你定义一个回调时,就好像你要睡觉了,然后你对某人说。

别给我打电话,我准备走的时候给你打电话。

相反,使用信号量就像:

如果你给我打 1000..0 次电话问我是否准备好了就可以了

这种情况下的开销是显而易见的……您通常需要一段时间才能醒来并再次入睡。 这是浪费处理器时间

请记住,在最好的情况下,您使用的信号量会使线程进入睡眠状态一段时间,然后再次询问是否可以确定继续。

如果不是这种情况,则该线程正在使用分配给它的所有处理器周期来询问您是否可以继续,即该线程中的 100% CPU 使用率 评估只是一个条件。

【讨论】:

  • 这个答案假设一个停放的线程(等待一个信号量)对系统来说是一个巨大的负载。我不熟悉这个概念。如果执行失败,可以返回一个值……为什么线程需要在app关闭之前丢失?
  • 如果您在该线程中执行昂贵的操作,并且碰巧线程挂起,或者发生了一些奇怪的事情,您将永远不会收到该值,并且您会不断询问它是否在同一个线程中完成.这将使线程保持活跃和忙碌,操作系统将无法使用它
猜你喜欢
  • 2015-11-21
  • 2017-03-22
  • 1970-01-01
  • 2021-10-16
  • 2018-10-31
  • 2018-02-14
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多