我已经成功实现了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
对象通常是由许多不同的数据对象组成的,因此,只要有可能,请使用NSData
的enumerateByteRangesUsingBlock:
方法来遍历数据,而不要使用字节方法(它将NSData
对象展平为单个存储块)。 ”
不,这是一个完全不相关的问题。我敢肯定,这里发生的问题要平庸得多。
不幸的是,我们这里没有足够的代码来诊断确切的问题。