【问题标题】:How to handle chunking while streaming JSON data to NSURLConnection如何在将 JSON 数据流式传输到 NSURLConnection 时处理分块
【发布时间】:2026-01-02 13:40:01
【问题描述】:

我有一个将 JSON 结果异步传输回 iOS 客户端的 Web 服务器。客户端正在使用 NSURLConnection 进行连接,我从该方法访问数据:

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

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

【问题讨论】:

  • JSON 数据包有多大?您是否担心连接会丢失部分 JSON,还是有其他原因?
  • 服务器一次只发送1024字节的数据。我拥有的数据很容易达到每个请求 10 kb。
  • 10KB 真的很小。但如下所述,有一个委托方法可以告诉您数据何时完成发送。
  • 你看过使用 YAJL 解析器(流式 JSON 解析器)吗?

标签: ios nsurlconnection


【解决方案1】:

你有两种方法

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

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

你可以在Web服务器端做以下事情,

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

      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 之类的东西,但也许这将是我最好的选择。
【解决方案2】:

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

【讨论】:

  • connectionDidFinishLoading 在我的情况下不起作用,因为我正在流式传输数据并在很长一段时间内保持异步连接处于打开状态,因此服务器可以在结果可用时将结果推送到客户端。只有在连接实际关闭时才会调用 connectionDidFinishLoading 方法。
最近更新 更多