2010-05-06 16 views
0

我有一個應用程序根據到達套接字或本地用戶交互的數據執行一些計算。當performSelector afterDelay時沒有發生排隊的視圖更新:0已使用

我想在計算髮生時顯示'活動微調'。

spinner = [[UIActivityIndiactorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
[spinner setCenter:self.view.center]; 
[self.view addSubview:spinner]; 
[spinner startAnimating]; 
[self performSelector:@selector(doCalcs) withObject:nil afterDelay:0]; 

這很適用,除非通過網絡傳遞消息來運行代碼。我使用http://code.google.com/p/cocoaasyncsocket/來處理套接字,並且代碼在onSocket:didReadData:withTag:方法中運行。

'doCalcs'需要幾秒鐘。微調器在運行時不會出現。

如果我將afterDelay:0更改爲afterDelay:1,則微調確實會出現doCalcs正在運行的整個時間,但缺點是需要多餘的秒數。所以看起來代碼是完全正確的,但無論出於何種原因,在doCalcs運行之前,微調器都沒有機會進入屏幕。

任何建議將是最受歡迎的。

+0

afterDelay:0.1也適用,這也許是一個合理的妥協。 – JosephH 2010-05-07 14:50:01

回答

1

你可以嘗試在後臺線程做你的計算,以防止動畫阻塞:

[self performSelectorInBackground:@selector(doCalcs)withObject:nil]; 
+0

謝謝,這似乎是一個合理的選擇。我仍然覺得對performSelector()和視圖更新發生的順序有一些不清楚的地方,但我想這是沒有文檔/沒有保證的。 – JosephH 2010-05-10 08:27:08

0

而不是選擇器,你需要產生一個線程來做你的計算。用戶界面只有在應用程序允許通過事件循環時纔會更新。並且你的方法被阻止。或者,您可以定期調用您的「doCalcs」方法,直到它們完成爲止......它應該在設定的時間段後退出,以便事件循環可以執行並執行「切片」中的計算。如果您需要更多的方向,請告訴我!

相關問題