NSUrlConnection ASynchronous究竟是什么意思?

时间:2009-11-10 11:21:15

标签: iphone

我很困惑Synchronous NSUrlConnection和ASynchronous NSUrlConnection之间的区别是什么?是同步还是异步?如果我们在connectionDidFinishLoading方法中使用detachNewThreadSelector,是吗? ASynchronous NSUrlConnection?这是最好的方法吗?任何教程......

4 个答案:

答案 0 :(得分:22)

同步意味着您触发NSURLConnection请求并等待它完成。

异步意味着您可以在NSURLConnection下载数据时触发请求并执行其他操作。

哪个是“最好的”?

同步非常简单:你设置它,触发它,然后等待数据返回。但是您的应用程序位于那里并且在下载所有数据,发生一些错误或请求超时之前什么都不做。如果您处理的不仅仅是少量数据,那么您的用户将坐在那里等待,这将无法提供良好的用户体验。

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

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

答案 1 :(得分:10)

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

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

  1. 异步连接。您从+ connectionWithRequest:delegate:(或其他非自动释放选项之一)开始,它会下载文件的位,在有趣的事情发生时调用您的委托。 runloop仍然存在,因此您的UI保持响应。当然,你必须要小心,你的代表不会超出范围。

  2. 同步。您开始与+ sendSynchronousRequest:returningResponse:error:建立连接,但代码会一直等到下载完成。您确实需要生成一个新线程(或Cocoa支持的更高级别的线程操作之一)或UI将阻止。

  3. 哪个选项“最佳”或最不痛苦取决于应用程序的体系结构以及您要实现的目标。如果您需要为长时间运行的进程创建一个线程,您可以使用第二个选项。一般来说,我会说第一个选项最简单。

    一切都很顺利documented on Apple's Developer site

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

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