当我打电话给这个街区时:
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被调用 - 发生了什么?我尝试了各种各样的解决方案,但没有任何效果。
答案 0 :(得分:1)
始终在主线程上执行与UI更新相关的任务,否则需要时间来执行UI。
喜欢,
所以请使用下面的代码
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更改。
希望这会对你有所帮助。