2009-11-15 71 views
2

我有一個ai循環,我想寫我的iPhone應用程序。我瞭解到,這個循環將花費時間進行計算並阻止主應用程序。Iphone多線程和AI

我想把它放在一個不同的線程中並運行事件。

例如,我會有一個事件,當玩家轉向開始時會被調用。 AI線程會聽它並做出反應。

我的ai線程與主線程進行通信的最佳方式是什麼?我使用NSNotificationcenter很多,但我正在閱讀奇怪的東西,因爲它不會在正確的線程上觸發事件?

什麼是通過像線程一樣的事件進行通信的最佳方式?

回答

5

我的建議是爲您的AI處理操作使用NSOperationQueue。當用戶執行動作時,創建一個處理AI處理的NSOperation來響應該事件並將其添加到NSOperationQueue中。如果這些操作之間存在依賴關係,或者如果您希望將處理分成更小的子操作,則可以將這些操作設置爲僅在滿足某些條件時才處理。

放置在NSOperationQueue中的操作將在後臺線程上運行,因此它們不會阻塞主線程。對於需要在主線程中執行的UI更新或其他操作,我建議使用-performSelectorOnMainThread:withObject:waitUntilDone:來調用操作中通過NSNotificationCenter的-postNotificationName:object:來發布通知的方法。讓您的視圖控制器或其他控制器響應這些通知,並根據您的AI例程的結果做他們需要的東西。

0

您可以使用方法- performSelectorOnMainThread:在主線程上執行給定的方法,在另一個線程上執行方法- performSelector:onThread:- performSelectorInBackground:。使用這些方法可以跨線程觸發事件。

但是請注意,要使用- performSelector:onThread: Run Loop必須在目標線程上運行,否則您的方法將不會執行。

1

而不是手動啓動一個單獨的線程,我會敦促你考慮使用NSOperation/NSOperationQueue。使用起來要容易得多,而且不容易出錯,並且在整個網絡上使用tutorials and examples

+0

哈哈 - 看到布拉德的解決方案,他的速度大約快了10秒,比我更詳細和描述性更強 – Till 2009-11-15 23:11:20

0

我在後臺線程中使用performSelectorInBackground來啓動AI,並且每次需要通知UI(AI結果動作,顯示AI工作進度條等)時,我都使用performSelectorOnMainThread:

當然,請記住在後臺線程中創建一個NSAutoReleasePool。