我已经成功实现了NSURLSessionUploadTask并在后台和前台工作。但是读取响应数据时会出现问题。

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{

    NSLog(@"1 DATA:\n%@\nEND DATA\n", [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]);

    [self.responseData appendData:data];
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    if (!error) {
        NSLog(@"AT THE END DATA:\n%@\nEND DATA\n", [[NSString alloc] initWithData: self.responseData encoding: NSUTF8StringEncoding]);

            [self parsingJSONResponse:self.responseData];

    } else {
        NSLog(@"HTTP uploading error : %@", error);
    }
}

这些是以上两个NSLogs的输出

1个数据:
{“成功”:true,“数据”:[{“uuid”:“8BE7DF37-9DA1-44D2-B48C-D012F699A9B1”,“id”:266626},{“uuid”:“3406D865-1A41-4FC6-BA0B- 0638F17757CC“,” id“:266656}],”错误“:[],” entityName“:” LeadProfile“}
结束数据

最终数据:
{“成功”:true,“数据”:[{“uuid”:“8BE7DF37-9DA1-44D2-B48C-D012F699A9B1”,“id”:266626},{“uuid”:“3406D865-1A41-4FC6-BA0B- 0638F17757CC“,” id“:266656}],”错误“:[],” entityName“:” LeadProfile“}} {” success“:true,” data“:[{” uuid“:” 8BE7DF37-9DA1-44D2- B48C-D012F699A9B1“,” id“:266626},{” uuid“:” 3406D865-1A41-4FC6-BA0B-0638F17757CC“,” id“:266656}],”错误“:[],” entityName“:” LeadProfile “}
结束数据

我不知道为什么这会给我一个上传任务两个不同的响应。每个位置的self.responseData如何不同?

有人认为这是因为苹果网站上提到的原因吗? (由于NSData对象通常是由许多不同的数据对象组成的,因此,请尽可能使用NSData的enumerateByteRangesUsingBlock:方法来遍历数据,而不是使用bytes方法(将NSData对象展平为单个内存块)developer.apple.com

最佳答案

你问:

我不知道为什么这会给我一个上传任务两个不同的响应。每个位置的self.responseData如何不同?

毫无疑问,这是因为responseData没有正确地或在正确的时间实例化的。 (我倾向于在didReceiveResponse中完成此操作。)请注意,您并不是在responseData中查看didReceiveData。您正在查看data。我建议在将responseData附加到data后立即检查didReceiveData,并且我敢肯定您也会在其中看到它加倍。问题是为什么它没有正确地实例化/初始化。

有人认为这是因为苹果网站上提到的原因吗?


“由于NSData对象通常是由许多不同的数据对象组成的,因此,只要有可能,请使用NSDataenumerateByteRangesUsingBlock:方法来遍历数据,而不要使用字节方法(它将NSData对象展平为单个存储块)。 ”


不,这是一个完全不相关的问题。我敢肯定,这里发生的问题要平庸得多。

不幸的是,我们这里没有足够的代码来诊断确切的问题。

10-04 23:04
查看更多