不build议使用iOS5 NSURLConnection方法

我试图写一个iOS应用程序,使asynchronous请求通过networking获取数据。 好像很多人推荐使用NSURLConnection,并经常提到委托方法连接:didReceiveData :.

不幸的是,我不能为了我的生活找出这个代表方法的logging。 首先,它不在NSURLConnectionDelegate的协议引用中 。 它在NSURLConnection类参考中列出,但是从iOS5开始已经被弃用了。 文档没有解释为什么它被弃用,或者开发人员应该用什么来实现类似的function。

我错过了什么? 我读过的很多内容似乎意味着对iOS5的NSURLConnection做了大的改动。 这些变化在哪里logging? 委托方法的文档是否完整?

谢谢

在头文件周围钓鱼告诉我,这些方法从一个非正式的协议(这是一个不赞成使用的Obj-C模式)转移到一个名为NSURLConnectionDataDelegate的正式的委托协议NSURLConnection.h ,但没有公共文档。

其余的文档像以前一样继续使用这些方法,所以我猜这是文档中的一个遗漏。 也就是说,这些方法(大部分)不会去任何地方,它们只是被重新组合成了几个协议,文档团队一直在放松。 尝试使委托对象符合相应的协议,并使用头文件中的签名来实现这些方法。

文档确实是一团糟,虽然看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) 

所以看来这些function确实还在那里。 只需将协议添加到@interface声明中即可。

我试过新的NSURLConnectionDownloadDelegate,被警告如果这些方法存在于你的委托中,你的NSURLConnectionDataDelegate方法将不会被调用。

我也有问题打开destinationURL,iOS不断告诉我文件不存在,虽然文档指出文件保证在方法调用期间存在。

该文档是一个@ $ @#$混乱。 这是真实的故事。

正如所写的,NSURLConnection的文档让你高兴而干燥。

文档的第一部分告诉你在NSURLConnection协议中使用各种方法(如连接:didReceiveData :)来处理传入的数据。 如果您点击概述中的任何一种方法,它会将您引导到一系列被弃用的方法!)

我已经能够拼凑在一起的真实故事是以前在NSURLConnectionProtocol中的大多数方法已经被移动到一个新的协议NSURLConnectionDataProtocol。 不幸的是,新的协议要么没有logging,要么没有编入索引,所以你找不到它。 这相当于同样的事情。)

在其他有趣的消息,显然是一个新的协议称为NSURLConnectionDownloadDelegate。 这听起来像iOS的NSURLConnection正在添加一些在MacOS的NSURLDownload中可用的function。 NSURLConnectionDownloadDelegate协议被logging。

你可能会认为从NSURLConnection中贬低这些方法将需要某种解释器,但我还没有find。 目前为止我所能做的最好的是从Apple的URL加载系统编程指南 :

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

这意味着一个非正式的协议。