2

我目前正在尝试使用他们的流 API 从 Twitter 流式传输数据。我附上了下面的代码,用于创建我的NSData并将其附加到didReceiveData. 出于某种原因,每次didReceiveData从 Twitter 收到响应时,它都会作为新的 JSON 根附加NSDataNSData.

我无法弄清楚发生了什么并将 JSON 发布到验证器中,它注意到 JSON 中有多个根。如何修改代码以继续附加到现有的 JSON 根?或者当 ? 中有多个 JSON 条目时,是否有更简单的方法来反序列化为 JSON NSData

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    // A response has been received, this is where we initialize the instance var you created
    // so that we can append data to it in the didReceiveData method
    // Furthermore, this method is called each time there is a redirect so reinitializing it
    // also serves to clear it
    NSLog(@"Did receive response");
    _responseData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Append the new data to the instance variable you declared
    NSLog(@"Did Receive data");
    [_responseData appendData:data];
}
4

2 回答 2

0

只是为处理同样事情的任何人跟进这个主题:我最终使用了支持流媒体的 SBJson。 http://superloopy.io/json-framework/

于 2013-09-03T20:54:48.370 回答
0

我认为您需要的只是一些额外的逻辑来处理它的实时性。使用您的 NSMutableData 作为容器继续接收数据,但在每批结束时,您应该扫描数据对象以查找所有有效对象,构建它们,并将它们存储到包含所有构建的 json 对象的不同对象中。在这个例子中,假设你有这个 ivar: NSMutableArray *_wholeObjects

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
  // Append the new data to the instance variable you declared
  NSLog(@"Did Receive data");
  [_responseData appendData:data];
  [self buildWholeObjects]
}

- (void) buildWholeObjects {
  NSArray *rootObjects = <#business logic to return one whole JSON object per array element, or return nil if none found#>
  if (rootObjects != nil) {
    NSUInteger bytesExtracted = 0;
    for (rootObject in rootObjects) {
      [_wholeObjects addElement:rootObject];
      bytesExtracted += rootObject.length;
    }
    NSData *remainingData = [_responseData subdataWithRange:NSMakeRange(bytesExtracted, _responseData.length - bytesExtracted];
    [_responseData setData:remainingData];
  }
}

完成此操作后,仅访问 _wholeObjects 中的对象,其中每个元素代表一个完全有效的 JSON 对象,您可以反序列化或以任何您需要的方式读取该对象。

只是为了清楚起见,假设第一个 NSData 表示:

{"a":"2"}{"c":"5

当您处理它时,_wholeObjects 将有一个表示 {"a":"2"} 的元素,而 _responseData 现在将是 {"c":"5

然后下一个数据流应该在对象上继续。可以说第二个 NSData 是:

"}

现在 _responseData 是 {"c":"5"} 因为我们将新消息附加到剩余的旧消息上。我们构建这个,并在 _wholeObjects 中获取第二个元素,并且 _responseData 将为空并准备接收下一组数据。

希望对一些人有所帮助。我认为对您来说最困难的部分是确定有多少 _responseData 被认为是有效的 JSON 对象。如果它们足够简单,您可以只计算打开 {/[ 到关闭 }/] 的数量并将该子字符串拉出。

于 2013-08-23T15:48:01.277 回答