是否使用GCD?

时间:2012-07-12 10:47:43

标签: ios multithreading user-interface grand-central-dispatch

我有一个iPhone应用程序,几乎是一个网站的移动应用程序。它所做的一切几乎都是从我们的服务器调用API方法。该应用程序检索用户的信息,并使用API​​不断更新服务器。

我和我的同事讨论了是否将GCD引入应用程序的下载方面。我的同事辩称,由于UI需要等待下载完成才能显示图片,文本或其他内容,因此绝对不需要GCD。我的论点是我们应该让主线程忙于UI渲染(即使没有数据),并将GCD引入应用程序以创建其他线程供下载。

哪个论点就在这里?在我的情况下,如果UI呈现没有数据,是否会出现某种滞后?哪个会产生更干净,更时尚,更快的应用程序?

4 个答案:

答案 0 :(得分:4)

一个论点是:当下载失败并因为服务器端出现问题而超时时会发生什么?

  • 如果没有GCD,应用程序将保持阻止状态,并在一段时间后崩溃 因为UI不能被阻止超过20秒。
  • 使用GCD,应用程序仍可正常运行但不会有数据 正在下载,应用程序不会崩溃。

要考虑的其他方面是:

  • 您正在使用的对象的线程安全性
  • 如何处理由于用户离开页面而不再需要的下载

答案 1 :(得分:2)

我不认为在主线程中进行耗时的操作是一个好主意。

即使用户必须等待数据下载才能执行任何有意义的操作,他仍然不希望UI被阻止。

假设您有一个导航器视图,在用户点击某个按钮后,您将新视图推送到该视图并开始下载某些内容。如果用户突然决定他不想再等待,他点击“后退”按钮。如果您的下载操作阻止UI,用户将不得不等待它结束,这真的很糟糕。

答案 2 :(得分:1)

如果您应该异步下载或在应用程序的主线程上下载一个更合适的问题,因为有几种不同的方法可以在iOS上异步下载(例如使用NSThread,NSOperation或GCD)。实现目标的简单方法可以是使用AFNetworking库。它使多线程网络/互联网代码非常容易实现和理解。

就我个人而言,我非常喜欢GCD,并建议你很快就会学习它,虽然它本身不适合异步下载,相比像AFNetworking这样的库(我相信它使用GCD)。

答案 3 :(得分:0)

这是一个很好的阅读使用NSOperationQueues(在幕后使用GCD)下载图像。您还可以查看一些Github代码。当用户移动到应用程序的不同部分时,他们有一个优雅的解决方案来暂停下载和排队新下载。

http://eng.alphonsolabs.com/concurrent-downloads-using-nsoperationqueues/?utm_medium=referral&utm_source=pulsenews

使用GCD / NSOperationQueues而不是使用NSThreads。您将对核心基础知识有一个很好的学习,同时创建一个结构良好的应用程序。 :)