我使用NSURLConnection的connection:didReceiveData:
方法拦截通过Twitter流API发送的传入数据。有时我注意到数据(例如推文的JSON字典)不完整,通常会在以下对didReceiveData:
的调用中完成。如果当前数据不完整,我可以等待然后追加,但我需要一种方法来确定。在NSData的最后,我应该等待什么,发出信号。完成?
写这个也让我考虑到我可能有一部分数据被部分接收的可能性,然后在它完成之前,可能是因为连接暂时丢失或者它已从发送中取消,我收到一些新数据的开始,完成。或者我可能会收到一些我没有开始的不完整数据。有没有办法让我确定是否应将此数据附加到我以前的现有数据中,是否与之相关?
编辑:回应第一个回复。
当使用Twitter Streaming API时,timeoutInterval
为-1,connectionDidFinishLoading:
永远不会被调用(也不是connection:didFailWithError:
)。调用connection:didReceiveResponse:
作为要调用的第一个委托方法。记录它可以得到:
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;
} }
有趣的是,这一次之后是&#34;朋友&#34;的日志,看起来就像是这个版本的更长版本(删除了大多数ID,并更改了ID):
connection did receive data: {
"friends" : [
189565864,
224868111,
89670443
]
}
&#34;朋友&#34;日志经常发生。但随后发布了一些关于推文的不完整数据。这是该数据的后半部分 - 它一直到最后完成,但没有包括数据的开始。在此之前从未收到过数据的开头。
答案 0 :(得分:2)
您应该实施NSURLConnectionDataDelegate
引入的connectionDidFinishLoading(_ connection: NSURLConnection)
来检查连接是否已成功加载。在流中的所有数据都已发送后,该方法称为。
如果在传输数据期间发生任何错误,则会调用connection(_:didFailWithError:)
,以便您可以清除所有收到的NSData
对象,并检查error
失败的原因。