2009-11-15 4 views
2

У меня есть цикл ai, который я бы хотел написать для своего приложения iphone. Я понимаю, что этот цикл займет время, чтобы выполнить вычисления и заблокировать основное приложение.Iphone multithreading и AI

Я хочу поместить его в другую тему и запустить все события.

Например, у меня было бы событие, которое будет вызываться, когда игроки начнут игру. Нить AI будет слушать его и реагировать.

Что является лучшим способом для моего потока ai общаться с основной темой? Я часто использую NSNotificationcenter, но я читаю странные вещи, как будто это не приведет к событию в правильной теме?

Каков наилучший способ общения через события, например, действия с потоками?

ответ

5

Моя рекомендация - использовать NSOperationQueue для ваших действий по обработке AI. Когда пользователь выполняет действия, создайте NSOperation, который обрабатывает обработку AI в ответ на это событие и добавляет его в NSOperationQueue. Если есть зависимости между этими действиями или если вы хотите разделить обработку на более мелкие суб-действия, вы можете настроить эти действия для обработки только при выполнении определенных условий.

Операции, размещенные в NSOperationQueue, будут выполняться на фоновом потоке, поэтому они не будут блокировать основной поток. Для обновлений пользовательского интерфейса или других действий, которые необходимо предпринять в основном потоке, я рекомендую использовать -performSelectorOnMainThread: withObject: waitUntilDone: вызвать метод в вашей операции, который отправляет уведомление через NSNotificationCenter -postNotificationName: object :. Попросите контроллер вашего вида или другого контроллера отреагировать на эти уведомления и сделать то, что им нужно, в ответ на результаты вашей программы ИИ.

0

Вы можете использовать методы - performSelectorOnMainThread: для выполнения данного метода в основном потоке и - performSelector:onThread: или - performSelectorInBackground: для выполнения метода в другом потоке. Используя эти методы, вы можете запускать события по потокам.

Обратите внимание, что для использования - performSelector:onThread: в целевом потоке должен быть запущен цикл выполнения, иначе вы не сможете выполнить метод.

1

Вместо того, чтобы вручную запускать отдельную нить, я настоятельно рекомендую вам использовать NSOperation/NSOperationQueue. С ним гораздо легче работать, гораздо меньше подвержено ошибкам и хорошо документировано с tutorials and examples во всем Интернете.

+0

lol - см. Решение брата, он был примерно на 10 секунд быстрее и гораздо более подробный и описательный, чем я – Till

0

Я запускаю AI в фоновом потоке с performSelectorInBackground и каждый раз, когда пользовательский интерфейс должен быть уведомлен о чем-то (результат, полученный AI, индикатор выполнения, показывающий работу ИИ и т. Д.) Я использую performSelectorOnMainThread:.

Конечно, не забудьте создать NSAutoReleasePool в фоновом потоке.