【发布时间】:2012-07-17 21:36:07
【问题描述】:
我在 GitHub 上创建了一个项目,以便了解如何优化我的 iOS 应用程序的网络。我大量使用了块和 GCD,在观看了 WWDC 2012 视频和过去几年的视频后,我了解到我可以使用 NSOperationQueue 做更多事情。具体来说,我可以控制并发操作(网络连接)的数量以及提供操作的取消。我正在尝试允许 1、2、4、8 和 16 个并发操作,我看到了我完全没有预料到的有趣结果。我正在测量结果,但我想知道我是否应该测量更多。
您可以在这里找到示例项目:
https://github.com/brennanMKE/OptimizedNetworking
由于我使用的是 NSURLConnection 的异步 API,因此拥有多个并发连接有很多好处,因为 API 会花费大量时间等待 HTTP 数据包。以前我的代码会从一系列项目开始下载并按顺序请求它们,这阻碍了并发的好处。我也一直在使用通知来取消网络连接。现在我可以通过操作对这个项目执行此操作,并且我已将它们设置为使用优先级和类别的值,以便我可以对下载进行优先排序和排序并取消操作类别。我可以选择为每个视图使用一个类别,当用户离开一个视图时,该视图的所有操作都将使用该类别取消。这将为活动视图释放资源。
使用更多并发操作的一个问题是 CPU 使用率以及 I/O,但我不知道使用 iOS 测量这些值的方法。 iOS 中用于显示 CPU 使用情况的“w”命令的等效项可能很有用。我不太关心 I/O,但衡量它会更全面。
我在网络上的主要问题是响应式 UI。我发现我一直在做的事情使 UI 变得迟缓。这种新方法可能会有很大帮助,但前提是我要减少并发操作的数量。最佳操作数可能因连接类型(3G、WiFi 等)而异,因此检查连接类型可能会导致一些优化。
如果您对加快应用中网络通信的更好方法感兴趣,请尝试这个示例项目,并建议我可以衡量性能的其他方法,并提供进一步优化通信的方法。 (另请注意,我引用了 Apple 示例项目 MVCNetworking 以及 ASIHTTPRequest 项目。
接下来我可能会做的是汇总下载的数据量,并记录该数据量以及完成下载的总时间。
自述文件应该有助于解释项目及其工作原理。
【问题讨论】:
-
+1,努力,也很有趣。
-
如果你看看我在 github 上的项目,NSOperation-WebFetches-MadeEasy,有一个帮助类可以为你管理操作。我在商店的两个应用程序中使用了这个确切的代码并取得了巨大的成功,我经常将超过 100 个操作添加到队列中。请注意,iOS 与 NSOperationsQueue 密切合作来管理负载。我从来没有看到对主线程有任何影响。
-
CodeFi 谢谢。 @DavidH 我已经分叉了你的项目,并将查看它,看看我可以从中学到什么。谢谢。
-
OperationsRunner 是类。本质上,您将其添加到您想要管理操作的任何类中。它非常小,只有几种您需要处理的方法。有示例 NSConcurrent 子类、用于构建的基类和 WebFetcher,它们也很小。
-
是的,我发现 MVCNetworking 示例与解决方案相去甚远。我现在看到大量使用 NSOperationQueue 和 16 个并发操作。
标签: ios networking nsoperationqueue