【问题标题】:NSURLSession (iOS 10) cut response from a serverNSURLSession (iOS 10) 切断来自服务器的响应
【发布时间】: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


【解决方案1】:

dispatch_semaphore_t 的整个使用是错误的,你一开始就不应该这样做。如果您需要在data 到达后执行某些操作,请在完成处理程序in 中执行,就在设置data 的行之后;不要玩愚蠢的信号量游戏并尝试在完成处理程序之后进行。您不能根据来自该网络的数据从使用异步网络的方法返回结果。你不能

【讨论】:

  • 您是正确的,他不应该使用信号量,但没有回答问题。信号量无法解释他描述的行为。
  • @Rob 我不知道。也许信号量正在解锁,这就是他的数据被缩减的原因。
  • Tbh 这可能应该是一条评论,马特 ;) 在低质量的帖子中被标记。我会把它留在这里,但希望你可以将它迁移到评论中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多