NSURLSession块中的方法延迟

时间:2015-06-20 10:26:32

标签: ios iphone nsurlsession xcode7 ios9

当我打电话给这个街区时:

NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:url
            completionHandler:^(NSData *data,
                                NSURLResponse *response,
                                NSError *error) {

                 _data = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

                _label.text = [NSString stringWithFormat:@"%@°",([[[self.data objectForKey:@"main"] objectForKey:@"temp"] floatValue]) - 273.15)];

            NSLog(@"%@",self.data);


            }] resume];

块中的代码需要很长时间才能执行,即使NSLog被调用 - 发生了什么?我尝试了各种各样的解决方案,但没有任何效果。

3 个答案:

答案 0 :(得分:1)

始终在主线程上执行与UI更新相关的任务,否则需要时间来执行UI。

喜欢,

  1. 更新标签文字。
  2. 在ImageView上设置图像。
  3. 与计时器相关的操作。
  4. 所以请使用下面的代码

    dispatch_async(dispatch_get_main_queue(), ^{
                _label.text = [NSString stringWithFormat:@"%@°",([[[self.data objectForKey:@"main"] objectForKey:@"temp"] floatValue]) - 273.15)];
    }
    

答案 1 :(得分:0)

请尝试以下代码:

dispatch_async(dispatch_get_main_queue(), ^{
   _label.text = [NSString stringWithFormat:@"%@°",([[[self.data objectForKey:@"main"] objectForKey:@"temp"] floatValue]) - 273.15)];
}

设置标签时。

原因:

您可能不在主线程上,不应该从其他线程更新UI。今天,当你这样做时,iOS不再崩溃,但它仍然“落后”。

答案 2 :(得分:0)

在iOS中,所有UI更改都将在主线程上进行,如果您尝试对块中的UI进行任何更改(在后台线程上执行),则会滞后。您可以使用dispatch_async(dispatch_get_main_queue(), ^{});来执行块中的UI更改。

希望这会对你有所帮助。