2015-08-07 1 views
3

У меня есть NSTimer() и логика AI для настольной игры. Логика ИИ занимает много времени, чтобы обработать от 3 до 5 секунд (это нормально). Когда программа выполняет логику ИИ, NSTimer не срабатывает, пока логика AI не завершит ее выполнение.Как запустить таймер и логику AI в Swift одновременно

Так я начал таймер на начальном этапе игры.

public var timer = NSTimer() 

...

let timeSelector:Selector = "timerFired" 
    if self.useTime { 
     timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: timeSelector, userInfo: nil, repeats: true) 
    } 

Я добавил логику AI в Обновление с SKScene так, что, когда он обнаруживает, что его очередь, он начнет проверку доступных ходов

override func update(currentTime: CFTimeInterval) { 
     if gameStatus.playerTurn == "AI" && !aiThiking { 
     aiThiking = true 
     aIPlayer.aiCheckAvaialbleMoves() 
     // executeMove 
     // change Turn 
     aiThiking = false 
     } 

Вопрос в том, можно ли запустить логику AI и позволить таймеру работать одновременно?

ответ

0

Ваша проблема заключается в том, что aIPlayer.aiCheckAvailableMoves() зависает от приложения столько, сколько требуется для выполнения, поэтому NSTimer не работает должным образом. Вы можете использовать различные threads, чтобы избежать этого:

dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    aIPlayer.aiCheckAvaialbleMoves() 
} 

Этот код запускает эту функцию в новом потоке и когда код закончился, поток автоматически закрывается.

Вы можете использовать блоки завершения, чтобы точно знать, когда функция закончилась. Вот пример:

func aiCheckAvailableMoves(completion : (result : BOOL) -> Void) { 
    dispatch_async(dispatch_get_global_queue(priority, 0)) { 
     //Do your code normally 

     //When you have finished, call the completion block (like a return) 
     completion(true) 
    } 
} 

А потом, с вашего update: вы получите, когда функция закончилась (пожалуйста, обратите внимание, здесь нет dispatch_async):

aIPlayer.aiCheckAvailableMoves(){ 
    //Finished checking moves, maybe schedule again? 
} 

Будьте осторожны с нитями, так как они могут вызывают нежелательное поведение и/или аварийные ситуации!

+0

спасибо. Я буду рассматривать многопоточность. Я новичок в быстроте. Поэтому я не знаю, как это работает. Мне нужно проверить, завершен ли этот процесс и/или остановить поток и запустить новый. Это возможно? если да, я попытаюсь найти источники многопоточности в Swift. –

+0

Повторите мой ответ, я думаю, это поможет вам лучше;) – aramusss

+0

хорошо! Спасибо большое. похоже, работает. как и ожидалось, мой кодекс аварии и ведут себя ненормально, но это нормально. я уверен, что можно выяснить, как их настроить. по крайней мере, мои проблемы синхронизации решены. –

Смежные вопросы