【问题标题】:iOS - Is it possible that [NSData dataWithContentsOfURL:url] would return only part of the bytes of the content?iOS - [NSData dataWithContentsOfURL:url] 是否可能只返回内容的部分字节?
【发布时间】:2012-03-21 15:45:57
【问题描述】:

[NSData dataWithContentsOfURL:url] 是否会在成功时返回全部字节数,或者如果出现问题,nil 会返回吗?

有没有可能,它可能只返回内容的一半字节......也许如果他们的互联网连接中途失败?

如果它有可能只返回部分数据,我是否可以使用其他更可靠的函数,并且我可以明确知道他们是否获得了全部数据?

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    我不确定 -dataWithContentsOfURL: 的实现:但无论如何都不推荐使用这样的同步方法。

    基于 NSURLConnection 的东西是你最好的选择,但你需要注意一些事情。大多数人没有意识到,如果在 NSURLConnection 正在接收数据时服务器断开连接,它不会导致下载失败并出现错误。 -connectionDidFinishLoading: 委托方法将被正常调用。很多人都搞错了。

    如果您想确保拥有所有数据,则需要处理-connection:didReceiveResponse: 委托方法并保存[response expectedContentLength] 的值。然后在-connectionDidFinishLoading: 中,您可以确保收到的字节数与预期的相同,否则会生成错误。

    有许多基于NSURLConnection 的免费库,例如AFNetworking。但是,您需要提防不良代码。我刚刚检查了AFNetworking 的来源,看来他们也没有检查服务器发回的数据少于Content-Length 标头指定的数据的情况。另请注意,流行的ASIHTTPRequest 已不再被积极开发,并且在其实施过程中受到了一些批评。

    我会让其他人推荐其他替代库,但NSURLConnection 是正确的方向。

    【讨论】:

    • 如果它在后台线程上,可以使用同步请求吗?除了其他一些东西,我已经为这项工作设置了后台线程,如果我可以使用[NSUrlConnection sendSynchronousRequest:returningResponse:error:],我的代码会更容易。使用该方法,我仍然可以获得响应对象,然后调用 [response expectedContentLength]。
    • 好吧,从技术上讲,同步调用会在它存在的线程之外创建另一个线程。同步方法只是围绕 NSURLConnection 的一个轻包装器,它从后台线程分离然后阻塞。有一个 WWDC 视频谈到了这一点,但我现在不记得标题了。
    【解决方案2】:

    如果您“担心”这样的事情,我建议您使用 NSURLConnection 和适当的代表。

    异步方法(即NSURLConnection)总是更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多