确定通过NSURLConnection收到的消息是否完整?

时间:2015-07-26 00:51:31

标签: ios swift nsurlconnection nsdata nsurlrequest

我使用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;日志经常发生。但随后发布了一些关于推文的不完整数据。这是该数据的后半部分 - 它一直到最后完成,但没有包括数据的开始。在此之前从未收到过数据的开头。

1 个答案:

答案 0 :(得分:2)

您应该实施NSURLConnectionDataDelegate引入的connectionDidFinishLoading(_ connection: NSURLConnection)来检查连接是否已成功加载。在流中的所有数据都已发送后,该方法称为

如果在传输数据期间发生任何错误,则会调用connection(_:didFailWithError:),以便您可以清除所有收到的NSData对象,并检查error失败的原因。