NSURLConnection 异步到底是什么意思?

问题描述 投票:0回答:4

我对同步 NSURLConnection 和异步 NSURLConnection 之间的区别感到困惑?有同步的还是异步的?如果我们在

detachNewThreadSelector
方法中使用
connectionDidFinishLoading
,是吗? 异步 NSURLConnection?哪个是最好的方法?

ios nsurlconnection
4个回答
22
投票

同步意味着您触发您的

NSURLConnection
请求并等待它完成。

异步意味着您可以在

NSURLConnection
下载数据的同时触发请求并执行其他操作。

哪个是“最好的”?

同步非常简单:您设置它,启动它,然后等待数据返回。但您的应用程序会坐在那里不执行任何操作,直到下载所有数据、发生某些错误或请求超时。如果您处理的数据量超过少量数据,您的用户将坐在那里等待,这不会带来良好的用户体验。

异步只需要多一点工作,但是您的用户可以在请求执行其操作时执行其他操作,这通常是更可取的。您设置了一些委托方法,让您可以跟踪传入的数据,这对于跟踪下载进度非常有用。对于大多数使用案例来说,这种方法可能更好。

您可以使用

NSURLConnection
执行同步和异步请求。 Apple 的 documentation 清楚地解释了这两种方法以及后一种方法所需的委托方法。


10
投票

您似乎将同步/异步连接和线程混为一谈。在我的应用程序中,我使用异步连接作为线程的替代方案。

假设您想要下载一个大文件而不导致 UI 冻结。您有两个基本选择:

  1. 异步连接。您从

    + connectionWithRequest:delegate:
    (或其他非自动释放选项之一)开始,它会下载文件的一些部分,当有趣的事情发生时调用您的委托。运行循环仍在继续,因此您的 UI 保持响应。当然,您必须小心您的委托不要超出范围。

  2. 同步。您可以使用

    + sendSynchronousRequest:returningResponse:error:
    启动连接,但代码会等待下载完成。您确实需要生成一个新线程(或 Cocoa 支持的高级线程操作之一),否则 UI 将阻塞。

哪个选项是“最好的”或最不痛苦的将取决于您的应用程序的架构以及您想要实现的目标。如果您无论如何都需要为长时间运行的进程创建线程,则可以选择第二个选项。一般来说,我会说第一个选项是最简单的。

一切都很好记录在Apple的开发者网站上


3
投票

其他回复中没有提到的是请求的大小。例如,如果您要下载大文件,那么使用异步连接会更好。您的代表将在数据块到达时收到它们。相比之下,同步方法将等待所有数据,然后再将其提供给您。委托可以更快地开始处理响应(更好的用户体验),或者将其保存到文件而不是内存中(更好的资源使用)。您还可以选择停止响应,而无需等待所有数据。

基本上,异步方法使您可以更好地控制连接,但代价是复杂性。同步方法要简单得多,但不应该在主 UI 线程上使用,因为它会阻塞。


2
投票

回应有关文件大小的其他答案:我认为文件大小并不重要。如果服务器响应非常慢并且您正在同步加载数据,即使您正在加载少量数据(例如 3k),您的 UI 仍然会冻结。

因此,在每种情况下我都会选择异步选项,因为你永远不知道在文件大小、服务器响应能力或网络速度方面会得到什么。

© www.soinside.com 2019 - 2024. All rights reserved.