我想使用 NSURLSession 从服务器接收xml流,并立即在屏幕上显示每个xml。
这是我的委托代码:
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
// Enumerate each message-body.
[data enumerateByteRangesUsingBlock:^(const void * _Nonnull bytes, NSRange byteRange, BOOL * _Nonnull stop) {
// Convert message-body to xml string.
NSString *string = [[NSString alloc] initWithBytes:bytes
length:byteRange.length
encoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
// Some code to display string.
// ...
});
}];
}
除一个问题外,此代码工作正常。 问题是,有时在接收流时, didReceiveResponse 后立即调用 didReceiveData ,它有时会收到多条HTTP消息,然后调用 didReceiveData 一次传递它刚收到的所有消息。
接收多条消息有时需要一段时间,并使我的应用程序无法实时显示xml。
是否有任何配置或属性可以立即调用 didReceiveData ?我阅读了该文档,但没有找到任何有用的信息。
非常感谢。
我尝试使用 NSURLConnection 来做同样的事情,它运行完美而没有这个问题。 立即在 didReceiveResponse 后面调用每个 didReceiveData 。
如何使 NSURLConnection 的 didReceiveData 像 NSURLConnection 一样工作?
答案 0 :(得分:0)
如果您尝试获取单个数据块,则可以考虑将其作为多部分响应从服务器发回。每个“部分”都包含您的一条消息,您将获得一个新的didReceiveResponse:每个消息之间的回调。
话虽如此,我不确定为什么NSURLConnection表现不同。他们在引擎盖下使用了很多相同的代码。您可以尝试向Apple提交错误。