如何在将JSON数据流式传输到NSURLConnection时处理分块

问题描述:

我有一个将JSON结果异步传输回iOS客户端的Web服务器。该客户端使用NSURLConnection的连接,我从方法访问数据:目前如何在将JSON数据流式传输到NSURLConnection时处理分块

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData) 

数据是回来在1024个字节块。但是,我不知道如何判断何时收到数据(如果邮件已完成),而不是将所有收到的数据附加到字符串,并尝试每次将其解析为JSON。这种方法似乎很容易出错 - 是否有更好的方法来处理这个问题?有什么会标记在标题或什么时候发送完整的响应?

+0

多大JSON包?你担心连接会丢失部分JSON,还是有其他原因? – bgoers 2013-03-27 18:57:32

+0

服务器一次只发送1024个字节的数据。我拥有的数据将很容易为每个请求10 kb。 – lehn0058 2013-03-27 19:00:29

+0

10KB真的很小。但是如下所述,有一个委托方法告诉你数据何时完成发送。 – bgoers 2013-03-27 19:03:50

有两种方式

第一&更好的办法是实现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; 

     } 

    } 
+0

方法#1在我的情况下不起作用,因为我正在流回数据并且长时间打开异步连接,所以服务器可以在客户端可用时将结果推送给客户端。 connectionDidFinishLoading方法只有在连接实际关闭时才会被调用。我希望避免实施方法#2,但也许这是我最好的选择。 – lehn0058 2013-03-28 13:01:14

在NSURLConnectionDataDelegate中,有一个方法connectionDidFinishLoading:应在服务器完成发送时调用。您还可以检索didReceiveResponse中的预期长度,但这不可靠并且需要服务器端支持。

+0

connectionDidFinishLoading在我的情况下不起作用,因为我正在流回数据并且长时间打开异步连接,所以服务器可以在客户端可用时将结果推送给客户端。 connectionDidFinishLoading方法只有在连接实际关闭时才会被调用。 – lehn0058 2013-03-28 12:56:02