2011-10-17 36 views
2

在我的應用我有在那裏我調用Web服務和檢索JSON,然後將其解析爲對象的數組一對夫婦的地方。耗時的部分絕對是Web服務調用。我想要的行爲如下:UIAlertView中有UIActivityIndi​​cator顯示出來太晚/線程問題

  1. 用戶選擇感興趣
  2. 排開,AlertView與ActivtiyIndi​​cator子視圖添加
  3. 數據加載在新的VC當前視圖
  4. 新觀點似乎
  5. AV指標去了

我的VC的配備doLoadData方法,基本上加載顯示的數據數組由每個VC。例如:

AnimalViewController有一個按鈕「查看狗」按下時的功能:

DogViewController *vc = [[DogViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
[vc release];

DogViewController擁有財產NSArray *dogs和方法doLoadDogs,這需要一段時間才能發生。

目前我在 「查看狗」 的方法:

  1. 與ActivityIndi​​cator
  2. 顯示它
  3. 創建VC
  4. 隱藏AlertView
  5. 創建AlertView
  6. 釋放和零它

這看起來似乎並不困難,但我還沒有找到線程的簡單實現。

回答

1

如果您的網絡電話/陣列的創建需要很長的時間,是在主線程,那麼這一切都將發生本質上在同一時間。當你做一些事情如顯示警報視圖,推動導航控制器等時,你實際上做的是安排這些事情發生在運行循環的下一個回合。由於你的「查看狗」方法基本上阻塞,直到一切完成,運行循環不會再次執行,直到需要一切後。

最好的解決方法是分解出你的網絡加載代碼,而不是阻止你的主線程/主事件循環。作爲一個快速解決方案,您可以使用GCD來分析當前的「查看狗」方法。作爲一個例子(顯然,這將需要更新您的實際需求/代碼):

- (void)viewDogs:(id)sender 
{ 
    dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
    // create and schedule the alert view 
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle...]; // your real alert view 
    dispatch_async(mainQueue, ^{ [alert show]; }); 
    dispatch_async(mainQueue, ^{ 
    DogViewController* vc = [[DogViewController alloc] init]; 
    [[self navigationController] pushViewController:vc animated:YES]; 
    [vc release]; 
    dispatch_async(mainQueue, ^{ [alert dismissWith...]; [alert release]; }); 
    }); 
} 
+0

這(上面的代碼塊)提高了一些事情的,但現在發生的事情是:viewDogs叫暫停,新的屏幕(帶數據和活動指示器)出現,活動指示器消失,黑角消失。我想要發生的是:viewDogs調用,在該屏幕上顯示活動指示器,直到loadDogs完成,然後顯示新屏幕 –

+0

@ jshin47是的,它不好。最好的辦法是將你的加載代碼分解出來,這樣它就不會阻塞,並在完成時以某種方式通知你。使用GCD來做這件​​事相對容易,但你不想用一種方法來完成。 –

+0

@JasonCoco爲什麼在不同的線程上使用dispatch_async而不是performselector? –

相關問題