如何在将JSON数据流式传输到NSURLConnection时处理分块
我有一个将JSON结果异步传输回iOS客户端的Web服务器。该客户端使用NSURLConnection的连接,我从方法访问数据:目前如何在将JSON数据流式传输到NSURLConnection时处理分块
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData)
数据是回来在1024个字节块。但是,我不知道如何判断何时收到数据(如果邮件已完成),而不是将所有收到的数据附加到字符串,并尝试每次将其解析为JSON。这种方法似乎很容易出错 - 是否有更好的方法来处理这个问题?有什么会标记在标题或什么时候发送完整的响应?
有两种方式
第一&更好的办法是实现connectionDidFinishLoading:
NSURLConnectionDataDelegate
委托时,连接已经完成成功加载,这将触发。
第二种方式是手动处理它,如下所示。
你可以做以下的事情在网络服务器端,
第一步:首先开始发送原始数据之前发送以下信息。
a.Number of Chunks.[totalSize/1024] (mandatory).
b.TotalSize(not mandatory).
你可以做以下的事情在客户并肩,
第一步:存储上述信息。
第二步:写下面的代码
@property (nonatomic,assign) int chunkNumber;
@property (nonatomic,strong) NSData *receivedData;
Self.chunkNumber = 1;
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData)myata{
if(self.chunkNumber != Number of Chunks)
{
if(!self.receivedData)
{
//allocate and initialize self.receivedData
}
[self.receivedData appendData:myData];
}
else
{
//completed . do whatever with self.receivedData.
//if you want to validate, just check the self.receivedData size with TotalSize
self.chunkNumber = 1;
}
}
方法#1在我的情况下不起作用,因为我正在流回数据并且长时间打开异步连接,所以服务器可以在客户端可用时将结果推送给客户端。 connectionDidFinishLoading方法只有在连接实际关闭时才会被调用。我希望避免实施方法#2,但也许这是我最好的选择。 – lehn0058 2013-03-28 13:01:14
在NSURLConnectionDataDelegate中,有一个方法connectionDidFinishLoading:
应在服务器完成发送时调用。您还可以检索didReceiveResponse中的预期长度,但这不可靠并且需要服务器端支持。
connectionDidFinishLoading在我的情况下不起作用,因为我正在流回数据并且长时间打开异步连接,所以服务器可以在客户端可用时将结果推送给客户端。 connectionDidFinishLoading方法只有在连接实际关闭时才会被调用。 – lehn0058 2013-03-28 12:56:02
多大JSON包?你担心连接会丢失部分JSON,还是有其他原因? – bgoers 2013-03-27 18:57:32
服务器一次只发送1024个字节的数据。我拥有的数据将很容易为每个请求10 kb。 – lehn0058 2013-03-27 19:00:29
10KB真的很小。但是如下所述,有一个委托方法告诉你数据何时完成发送。 – bgoers 2013-03-27 19:03:50