【发布时间】:2016-10-10 21:37:50
【问题描述】:
我已经编写了这段代码来向服务器发送一个 HTTP 请求,该服务器向我发送一个 json 字符串:
-(NSDictionary*)doRequestWithCommand:(NSString*)command andBody:(NSString*)requestBody {
__block NSDictionary *result = nil;
NSURL *URL = [NSURL URLWithString: [NSString stringWithFormat:@"%@%@", PREFIX_URL, command] ];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
[request setHTTPMethod:REQUEST_TYPE_POST];
[request setHTTPBody:[requestBody dataUsingEncoding:NSUTF8StringEncoding]];
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
__block BOOL done = NO;
while ( !done ) {
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if ( data != nil ) {
result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:4]);
NSLog(@"len %lu", [[[NSString alloc] initWithData:data encoding:4] length]);
done = YES;
}
dispatch_semaphore_signal(sem);
}];
[dataTask resume];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
}
return result;
}
此代码适用于 iOS 9 及更低版本,但不适用于 iOS 10!实际上,服务器的答案是第 1610 个字符!
不知道怎么回事! 你能帮帮我吗?
谢谢
【问题讨论】:
-
你应该检查
dataTaskWithRequest返回的错误对象。是nil吗?此外,您应该捕获JSONObjectWithData返回的错误对象并查看它是否为nil。每当代码不起作用时,您应该做的第一件事就是开始检查错误对象。 -
result是否引用nil?如果nil,我怀疑来自服务器的 JSON 响应存在问题。您是手动构建此 JSON,还是使用 API 为您构建它?同样,如果出现问题,JSONObjectWithData返回的错误对象会告诉您 JSON 有什么问题(如果有的话)。 -
错误为零!答案(结果)不是零,而是从 iOS 中删除的。答案是从服务器生成的,并且完整且正确!如果我尝试从一个休息客户端做一个请求,答案是正确的,没有删减,所以问题是 iOS,但我不知道它是什么!
-
问题可能是你的控制台没有打印出所有的响应!!!如果字符串到达,请尝试使用调试器!不要相信印刷品! ;-)
-
@GeneCode Francesco Scala 给出了答案:问题可能是在您的控制台中没有打印所有响应!!!如果字符串到达,请尝试使用调试器!不要相信印刷品! ;-) –
标签: objective-c nsurlsession ios10 nsurlsessiondatatask