0

我想使用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.
            // ...
        });
    }];
}

这段代码工作正常,除了一个问题。问题是,有时在接收流时,didReceiveData不会在didReceiveResponse之后立即被调用,它有时会接收多个 HTTP 消息,然后调用didReceiveData一次以传递它刚刚为我接收的所有消息。

有时接收多条消息可能需要一段时间,并且使我的应用程序无法实时显示 xml。

是否有任何配置或属性可以使其立即调用didReceiveData?我阅读了文档,但没有发现任何有用的信息。

谢谢一堆。

更新:

我尝试使用NSURLConnection来做同样的事情,它运行完美,没有这个问题。每个didReceiveData都会在didReceiveResponse后面立即调用。

如何使NSURLSessiondidReceiveDataNSURLConnection一样工作?

4

1 回答 1

0

IIRC,NSURLSession 应该在接收到数据时发送数据,但只有在它接收到一定的数据之后,或者在一段时间之后。

如果您尝试获取单个数据块,则可以考虑将它们作为多部分响应从服务器发回。每个“部分”都将包含您的一条消息,并且您将在每条消息之间获得一个新的 didReceiveResponse: 回调。

话虽如此,我不确定为什么 NSURLConnection 的行为会有所不同。他们在后台使用了很多相同的代码。您可以尝试向 Apple 提交错误。

于 2015-12-03T21:55:31.887 回答