【问题标题】:NSURLConnection methods no more available in IOS5NSURLConnection 方法在 IOS5 中不再可用
【发布时间】:2011-12-09 20:21:55
【问题描述】:

我正在查看NSURLConnection 类,该类可用于建立与 URL 的同步或异步连接,然后检索其数据... IOS 5 对此类进行了很多更改,我已经看到他们引入了一些与身份验证或下载相关的正式协议,但我看不到,例如,connection:didReceiveResponse: 消息(以前发送给委托人并且不再可用)是否仍然可用协议..如何实现异步连接并在收到响应后立即检索 HTTP 标头?我确信有比使用NSURLConnectionconnection:didReceiveResponse: 消息更好的方法。像stringWithContentsOfURL 这样的方法总是同步加载内容吗?您使用什么来在您的应用程序中实现异步下载,以避免不推荐使用的方法并对诸如 _http response received_m 等事件做出反应?如果可能,您是否在后台任务中启动同步下载?

【问题讨论】:

  • 按原样,您的问题应该分成多个问题:您的问题中可能有五个问题。我的回答解决了我认为您最大的问题,即明显删除了 iOS 4.3 中可用的连接委托方法。

标签: nsurlconnection ios5


【解决方案1】:

NSURLConnectionDelegate 已成为正式协议(在以前的版本中是非正式协议)。在此协议中,声明了以下(非弃用)方法:

  • connection:didFailWithError:
  • connectionShouldUseCredentialStorage:
  • connection:willSendRequestForAuthenticationChallenge:

此外,还有两个符合NSURLConnectionDelegate的子协议:

NSURLConnectionDataDelegate 用于将数据加载到内存的委托,并声明了以下方法,我相信您会熟悉其中的一些方法:

  • connection:willSendRequest:redirectResponse:
  • connection:didReceiveResponse:
  • connection:didReceiveData:
  • connection:needNewBodyStream:
  • connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
  • connection:willCacheResponse:
  • connectionDidFinishLoading:

NSURLConnectionDownloadDelegate 用于将数据直接存储到磁盘文件的委托,并声明了以下方法:

  • connection:didWriteData:totalBytesWritten:expectedTotalBytes:
  • connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:
  • connectionDidFinishDownloading:destinationURL:

如您所见,您仍然可以使用以前的委托,可能需要进行一些小的修改。

有关详细信息,请参阅本地 Xcode 安装中的 iOS 4.3 to iOS 5.0 API Differences document 和 NSURLConnection.h。当新的 SDK 版本发布时,头文件中的文档比开发人员库中可用的文档更可靠的情况并不少见。后者需要一段时间才能更新。

【讨论】:

  • 谢谢...我刚刚看到参考文档还没有更新,所以API差异文档和头文件是一个很好的起点。我想我在某个地方看到过(我现在找不到......)文档说通常你的应用程序不应该实现 NSURLConnectionDataDelegate 协议......告诉我我是否错了:如果你需要实现一种下载进度条,你不应该使用didReceiveData 以了解您何时下载了一些数据,或者我是否误解了 didReceiveData 的工作原理以及发送时间?
  • @Gianni 是的,-…didReceiveData: 被发送给代理以通知已收到数据。除了存储这些数据,您还可以使用它来更新下载进度条。
  • 仅供参考,截至 2012 年 4 月 8 日,5.1 SDK 文档仍然没有关于 NSURLConnectionDataDelegate 的完整参考(无论是在线还是在 SDK 中)。
  • GRRRRR!截至 2013 年 3 月 9 日,NSURLConnection 类参考仍然没有提及任何关于 NSURLConnectionDataDelegate 的内容。如果不是因为这个问题,我仍然会搜索。这是 Apple 关于此协议的文档:developer.apple.com/library/ios/#documentation/Foundation/…
  • “NSURLConnectionDelegate 已经成为正式协议了……” 你的意思是“NSURLConnectionDataDelegate”,还是我理解错了?
【解决方案2】:

我刚刚遇到了同样的问题。看起来使用块和NSOperationQueue 发送异步请求更加简化。

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

这意味着委托现在仅用于身份验证和失败问题。

【讨论】:

  • 谢谢,我在参考文档中找不到,可能很快就会更新。
  • 通常现在已更新。但是请注意,因为此方法在 iOS 4.3 上不可用。总而言之:您需要实现这两种方式才能与 iOS 4.3 和 iOS 5.0 兼容。
【解决方案3】:

不! 如果您仔细查看 Apple 的库,它们不仅限于用于身份验证和失败问题。

自从将+(void)sendAsynchronousRequest:queue:completionHandler: 引入到NSConnection 类对象中,许多可以像以前一样执行NSConnectionDelegate 方法的东西现在可以在称为“NSConnectionDataDelegate”和NSConnectionDownloadDelegate 的正式协议中使用,开辟了一个新的空间来添加NSURLConnection 方法的更多功能。 (从 iOS5 开始)

所以我认为这是一种改进,而不是限制它们的使用。

【讨论】:

    【解决方案4】:
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多