2010-08-24 78 views
0

有沒有辦法手動更新用戶界面?例如,我有一個更新UI並執行一些邏輯的功能。 UI更新後,它將執行一些需要很長時間的邏輯,UI的更新必須等待直到邏輯執行完成。 即使邏輯甚至被執行,是否有手動更新UI的方法?手動更新用戶界面

看來,線程可以在這裏使用。 但有沒有辦法解決這個不使用線程? 另外,如果可以使用線程,那麼最佳實踐是什麼?

謝謝!

回答

1

由於UI線程是應用程序的主線程,因此在此期間處理大型操作通常不是一個好主意,因爲您在此期間凍結了用戶界面(這不方便用戶使用)。

你使用線程的方式取決於你想要做什麼,你可以例如只使用- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg或者你可以創建自己的線程和更具體。

如果您想在其他線程的UI上進行一些更改,請不要忘記調用- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

從iOS參考資料庫中,您可以在guide中找到關於線程編程的所有需求。

希望這會有所幫助!

+0

感謝您的回覆Ermiar。 當你需要更新一個UI然後另一個UI但不是同時更新時,這個更新問題實際上發生了很多。 讓我舉個例子。 假設我想關閉一個控制器,調用這個控制器1,然後右擊一個控制器,調用該控制器2.控制器2的父控制器是controller1,控制器1的父控制器是控制器。 然後這個問題就會發生。它實際上會解僱第一個控制器,但不會解散第二個控制器。 您是否認爲這種情況下,我們沒有其他選擇,只能創建一個新的線程? – 2010-08-26 15:39:37

+0

此外,我正在使用一種非常黑客的方式來解決這個問題。 我正在使用NSTimer解僱controller1。 只是好奇,當使用NSTimer時,它是否創建另一個線程? – 2010-08-26 15:40:36

+0

這取決於你如何初始化定時器,如果使用scheduledTimerWithTimeInterval,定時器將在當前線程的當前循環中創建。否則,您必須將計時器添加到其他線程的運行循環中。 你可以使用其他方法在延遲如performSelector後在當前線程中執行動作:withObject:afterDelay:如果你只想等待一些東西。 – Ermiar 2010-08-26 16:51:20

0

你在想一個簡單的進度條嗎?如果是這種情況,那麼你可以使用NSApp的東西(請參閱管理事件循環部分)並使用runModalForWindow:和runModalSession:這些將允許您打開進度面板,報告狀態並允許方法取消操作。

由於操作是模式化的,所以其他UI元素將被停用,直到面板被解散。

+0

我在這裏談論可可觸摸層的UIkit。 不是從基礎層以後的Appkit ... – 2010-08-26 15:43:06