我正在尝试编写一个iOS应用程序,该应用程序通过网络发出异步请求以获取数据。似乎很多人建议使用NSURLConnection,并经常提到委托方法连接:didReceiveData:。
不幸的是,我不能为我的生活找到这个委托方法的记录。例如,它不在the protocol reference for NSURLConnectionDelegate。它列在the NSURLConnection Class Reference中,但从iOS5开始显然已被弃用。该文档没有解释为什么它被弃用,或者开发人员应该使用什么来实现类似的功能。
我错过了什么?我读过的很多内容似乎暗示对iOS5的NSURLConnection进行了重大修改。这些变化记录在哪里?委托方法的文档是否完整?
由于
答案 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:
意味着非正式协议。