我正在使用 NSURLConnection 的 connection:didReceiveData:
方法拦截通过 Twitter 流 API 发送的传入数据。有时我注意到数据(例如推文的 JSON 字典)不完整,通常会在以下对 didReceiveData:
的调用中完成。如果当前数据不完整,我可以等待然后追加,但我需要一种方法来确定这一点。我应该等待 NSData 的末尾有什么东西来表示它的完成吗?
写这篇文章也让我考虑到我可以部分接收一组数据的可能性,然后在它完成之前,可能是因为连接暂时丢失或发送被取消,我接收到一些数据的开始新数据,完成。或者我可能会收到一些不完整的数据,而我还没有开始。有没有一种方法可以确定我是否应该将此数据附加到我以前的现有数据中,是否相关?
编辑:响应第一个响应。
当使用 Twitter Streaming API 时,timeoutInterval
为 -1,connectionDidFinishLoading:
永远不会被调用(connection:didFailWithError:
也不会被调用). connection:didReceiveResponse:
被调用,作为第一个被调用的委托(delegate)方法。记录它给出了这个:
connection did receive response: <NSHTTPURLResponse: 0x17402b120> { URL: https://userstream.twitter.com/1.1/user.json } { status code: 200, headers {
Connection = close;
"Content-Encoding" = gzip;
"Content-Type" = "application/json";
Date = "Sun, 26 Jul 2015 11:48:50 GMT";
Server = tsa;
"Transfer-Encoding" = Identity;
"x-connection-hash" = d2d3baf7a03549b07abcd9410de47ccd;
} }
有趣的是,这一次后面跟着一个“ friend ”的日志,看起来像是这个的更长版本(删除了大部分 ID,并更改了 ID):
connection did receive data: {
"friends" : [
189565864,
224868111,
89670443
]
}
“ friend ”日志经常出现。但随后出现了一些关于推文的不完整数据。这是该数据的后半部分 - 它一直到最后都是完整的,但不包括数据的开头。在此之前从未收到数据的开头。
最佳答案
您应该实现 NSURLConnectionDataDelegate
介绍的 connectionDidFinishLoading(_ connection: NSURLConnection)
检查连接是否已成功完成加载。 在流中的所有数据都已发送后调用该方法。
如果在数据传输过程中出现任何错误,connection(_:didFailWithError:)
被调用以便您可以清除所有接收到的 NSData
对象并检查 error
失败的原因。
关于ios - 确定通过 NSURLConnection 收到的消息是否完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632546/