0

我有一個TabBarController,其中包含3個TabBarItems。當單擊第二個TabBarItem時,將構建並加載UITableView。花費足夠長的時間來加載表格,沒有任何進展,並且用戶指示下一個場景正在前進將是禮貌的。但是,我一直無法得到這個工作。我已經嘗試使用GCD來實現加載掩碼,但只有在加載表時纔會顯示它。經過20秒後,情況並不理想。由於UITableView被構建和加載,無法顯示MBProgressHUD加載蒙版

我試過這個代碼以TabBarItem點擊迴應:

[MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), 
       ^{ 
        dispatch_async(dispatch_get_main_queue(), ^{ 


         NSLog(@"dispatch"); 
         [self.navigationController.view.superview addSubview:HUD]; 

         [MBProgressHUD hideHUDForView:viewController.view animated:YES]; 

        }); 



       }); 

我也試過它作爲UITableView的是正在興建

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 

    dispatch_sync(queue, ^{ 

      UIImage * image = [UIImage imageWithData:imageData]; 

      dispatch_sync(dispatch_get_main_queue(), ^{ 

      [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES]; 

      [cell.merchItemImageView setImage:image]; 

      NSLog(@"shortDesc==%@",merchitem.itemName); 
      NSLog(@"itemPrice==%@",merchitem.itemPrice); 

      cell.merchItemShortDesc.text = [NSString stringWithFormat:@"%@",merchitem.itemName]; 
     cell.merchItemPrice.text = [NSString stringWithFormat:@"$%@",merchitem.itemPrice]; 



}); 

}); 

回答

1

嘗試在表中查找建立/加載代碼,它開始嚴重地阻塞用戶界面並將代碼移到次要方法。在最初的方法調用MBProgressHUD結束時,在第零延遲之後在當前運行循環中排隊一個選擇器。這樣做首先運行掛起的UI操作(包括MBProgressHUD的對話框),然後運行阻止代碼。我爲blocking CSV file importation做了類似的工作,首先顯示SVProgressHUD警報,然後執行無響應的任務。

所以,如果你的代碼看起來是這樣的:

step1; 
step2; 
really_long_step3; 

,你可以像

step1; 
    [MBProgressHUD updates]; 
    [self performSelector:@selector(do_remaining_steps) 
     withObject:nil afterDelay:0]; 
} 
- (void)do_remaining_steps 
{ 
    step2; 
    really_long_step3; 
    [MBProgressHUD reportSomeSuccessScreen]; 
} 

這裏的關鍵是要找到其中的標籤交換和視圖創建層次做你的代碼塊把它分解以及如何拆分它以便在長時間運行加載之前發生UI更新。希望這一切都發生在你的-(void)viewDidLoad方法中,所以viewDidLoad會在更新HUD之前在最後排隊do_remaining_steps選擇器。

+0

感謝您的回覆@Grzegorz。但是,我無法弄清楚這一點。在點擊tabbaritem之後,轉換實際上是在Storyboard上進行的。上面的代碼分別在以下方法中實現 - - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController和 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath。我試圖按照你的建議分解工作,但是我不知道如何在表格單元格構建時如何去做。 –

+0

你需要找到在你的tableview代碼中究竟花了多長時間。既然你說需要20秒,我會在''loadView'',''viewDidLoad''和其他在控制器生命週期中調用的方法中找到一個斷點來解決這個問題。你可以嘗試的另一件事是設置tableview空的「加載」消息,並在第一次調用「viewDidAppear」時實際構建單元格。到這個方法被調用時,「加載」消息應該是可見的。 –