首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS dismissViewControllerAnimated 延遲問題的解決方案

     編輯:程式設計綜合問答

問題現象

在網路請求成功的回調 Block 中呼叫 dismissViewControllerAnimated:completion:,雖然 Block 執行正常(Log 顯示),但視圖控制器需 3-4 秒才真正消失。

根本原因

網路回調通常在背景執行緒執行,UIKit 操作必須在主執行緒進行。若在背景執行緒呼叫 dismiss,系統會延遲處理甚至導致異常。

解決方法

使用 GCD 將 dismiss 操作調度到主佇列:

dispatch_async(dispatch_get_main_queue(), ^{
    [self dismissViewControllerAnimated:YES completion:nil];
});

完整修正範例

[api loginWithUsername:... andSuccessBlock:^(id json) {
    NSString *status = [json objectForKey:@"status"];
    if ([status isEqualToString:@"ok"]) {
        app.user = [json objectForKey:@"data"];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self dismissViewControllerAnimated:YES completion:nil];
        });
    } else {
        // 顯示錯誤提示
    }
}];

最佳實踐

  • 所有 UI 更新(含 present/dismiss、Alert 顯示、TableView 重載)均需在主執行緒。
  • 使用 NSOperationQueue.mainQueue 或 Swift DispatchQueue.main.async 同理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved