在網路請求成功的回調 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 {
// 顯示錯誤提示
}
}];
NSOperationQueue.mainQueue 或 Swift DispatchQueue.main.async 同理。