不推荐使用iOS5 NSURLConnection方法

时间:2011-10-22 20:18:11

标签: ios ios5

我正在尝试编写一个iOS应用程序,该应用程序通过网络发出异步请求以获取数据。似乎很多人建议使用NSURLConnection,并经常提到委托方法连接:didReceiveData:。

不幸的是,我不能为我的生活找到这个委托方法的记录。例如,它不在the protocol reference for NSURLConnectionDelegate。它列在the NSURLConnection Class Reference中,但从iOS5开始显然已被弃用。该文档没有解释为什么它被弃用,或者开发人员应该使用什么来实现类似的功能。

我错过了什么?我读过的很多内容似乎暗示对iOS5的NSURLConnection进行了重大修改。这些变化记录在哪里?委托方法的文档是否完整?

由于

4 个答案:

答案 0 :(得分:47)

围绕头文件钓鱼告诉我,这些方法已从非正式协议(已弃用的Obj-C模式)转移到名为NSURLConnectionDataDelegate的正式委托协议中,该协议位于NSURLConnection.h中,但不是没有公开文件。

其余文档一如既往地继续使用这些方法,所以我猜这是文档中的遗漏。即这些方法(大多数)不会去任何地方,它们只是被重新调整为几个协议,文档团队一直在懈怠。尝试使您的委托对象符合相应的协议,并使用头文件中的签名实现这些方法。

答案 1 :(得分:24)

文档确实是一团糟,虽然从NSURLConnection.h查看4.3到5.0的更改日志:

删除

Removed -[NSObject connection:canAuthenticateAgainstProtectionSpace:]
Removed -[NSObject connection:didCancelAuthenticationChallenge:]
Removed -[NSObject connection:didFailWithError:]
Removed -[NSObject connection:didReceiveAuthenticationChallenge:]
Removed -[NSObject connection:didReceiveData:]
Removed -[NSObject connection:didReceiveResponse:]
Removed -[NSObject connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:]
Removed -[NSObject connection:needNewBodyStream:]
Removed -[NSObject connection:willCacheResponse:]
Removed -[NSObject connection:willSendRequest:redirectResponse:]
Removed -[NSObject connectionDidFinishLoading:]
Removed -[NSObject connectionShouldUseCredentialStorage:]
Removed NSObject(NSURLConnectionDelegate)

Added -[NSURLConnection currentRequest]
Added -[NSURLConnection originalRequest]
Added +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]
Added -[NSURLConnection setDelegateQueue:]
Added NSURLConnectionDataDelegate
Added -[NSURLConnectionDataDelegate connection:didReceiveData:]
Added -[NSURLConnectionDataDelegate connection:didReceiveResponse:]
Added -[NSURLConnectionDataDelegate connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:]
Added -[NSURLConnectionDataDelegate connection:needNewBodyStream:]
Added -[NSURLConnectionDataDelegate connection:willCacheResponse:]
Added -[NSURLConnectionDataDelegate connection:willSendRequest:redirectResponse:]
Added -[NSURLConnectionDataDelegate connectionDidFinishLoading:]
Added NSURLConnectionDelegate
Added -[NSURLConnectionDelegate connection:canAuthenticateAgainstProtectionSpace:]
Added -[NSURLConnectionDelegate connection:didCancelAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connection:didFailWithError:]
Added -[NSURLConnectionDelegate connection:didReceiveAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connection:willSendRequestForAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connectionShouldUseCredentialStorage:]
Added NSURLConnectionDownloadDelegate
Added -[NSURLConnectionDownloadDelegate connection:didWriteData:totalBytesWritten:expectedTotalBytes:]
Added -[NSURLConnectionDownloadDelegate connectionDidFinishDownloading:destinationURL:]
Added -[NSURLConnectionDownloadDelegate connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:]
Added NSURLConnection(NSURLConnectionQueuedLoading)

所以似乎这些功能确实存在。只需将协议添加到@interface声明中,就可以了。

我尝试了新的NSURLConnectionDownloadDelegate,请注意,如果您的委托中存在这些方法,则不会调用NSURLConnectionDataDelegate方法。

我也有问题打开destinationURL,iOS一直告诉我文件不存在,尽管文档表明文件在方法调用期间保证存在。

答案 2 :(得分:7)

文档是@ $ @#$ mess。那是真实的故事。

NSURLConnection上的文档,正如所写,让你高高在上。

文档的第一部分告诉您使用NSURLConnection协议中的各种方法(如connection:didReceiveData:)来处理传入的数据。如果您在概述中单击任何这些方法,它会引导您进入已弃用的方法列表!)

我能够拼凑起来的真实故事是,以前NSURLConnectionProtocol中的大部分方法都已移至名为NSURLConnectionDataProtocol的新协议。不幸的是,新协议要么没有记录,要么没有编入索引,所以你找不到它。这相当于同样的事情。)

在其他有趣的新闻中,显然有一个名为NSURLConnectionDownloadDelegate的新协议。对于iOS来说,NSURLConnection听起来像是添加了MacOS中NSURLDownload中可用的一些功能。 NSURLConnectionDownloadDelegate协议已记录在案。

答案 3 :(得分:0)

您会认为从NSURLConnection中弃用这些方法会保证某种解释器,但我还没有找到。到目前为止,我能做的最好的事情来自Apple的URL Loading System Programming Guide

  

为了下载URL的内容,应用程序需要提供一个委托对象,该对象至少实现以下委托方法:connection:didReceiveResponse:connection:didReceiveData:connection:didFailWithError:connectionDidFinishLoading:

意味着非正式协议。