0

当我调用这个块时:

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,块内的代码也需要很长时间才能执行——这是怎么回事?我尝试了各种解决方案,但没有任何效果。

4

3 回答 3

1

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

喜欢,

  1. 更新标签文本。
  2. 在 ImageView 上设置图像。
  3. 定时器相关操作。

所以使用下面的代码

dispatch_async(dispatch_get_main_queue(), ^{
            _label.text = [NSString stringWithFormat:@"%@°",([[[self.data objectForKey:@"main"] objectForKey:@"temp"] floatValue]) - 273.15)];
}
于 2015-06-21T03:54:52.237 回答
0

请尝试以下代码:

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

当您设置标签时。

原因:

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

于 2015-06-20T10:32:30.440 回答
0

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

希望这会帮助你。

于 2015-06-20T10:37:55.477 回答