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

时间:2013-03-27 18:47:41

标签: ios nsurlconnection

我有一个Web服务器,它将JSON结果异步回流到iOS客户端。客户端使用NSURLConnection连接,我从方法中访问数据:

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

数据目前以1024字节块的形式返回。但是,我不知道如何判断消息完成时是否收到数据,而不是将我收到的所有数据附加到字符串中,并尝试每次都将其解析为JSON。这种方法似乎很容易出错 - 是否有更好的方法来处理这个问题?在发送完整响应时会在标题中标记的内容?

2 个答案:

答案 0 :(得分:2)

你有两种方式

第一&更好的方法是实现connectionDidFinishLoading: NSURLConnectionDataDelegate委托,它将在连接成功加载时触发。

第二种方法是手动处理,如下所示。

您可以在Web服务器端执行以下操作,

Step1:在开始发送原始数据之前先发送以下信息。

      a.Number of Chunks.[totalSize/1024] (mandatory).
      b.TotalSize(not mandatory).

您可以在客户端方面执行以下操作,

第1步:存储上述信息。

第2步:编写以下代码

@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 :(得分:1)

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