簡體   English   中英

NSURLSession塊中的方法延遲

[英]Method Delay In NSURLSession Block

當我調用此塊時:

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,該塊內的代碼也需要花費很長時間才能執行-發生了什么? 我嘗試了各種解決方案,但沒有任何效果。

始終在主線程上執行與UI更新相關的任務,否則執行UI會花費一些時間。

喜歡,

  1. 更新標簽文本。
  2. 在ImageView上設置Image。
  3. 定時器相關的操作。

所以使用下面的代碼

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

請嘗試以下代碼:

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

設置標簽時。

原因:

您可能不在主線程上,並且永遠不要從其他線程更新UI。 如今,當您執行此操作時,iOS不再崩潰,但仍然落后。

在iOS中,所有UI更改都將在主線程上進行,如果您嘗試在一個塊(在后台線程上執行)中對UI進行任何更改,則會滯后。 您可以使用dispatch_async(dispatch_get_main_queue(), ^{}); 在塊中執行UI更改。

希望這會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM