2014-07-13 4 views
1

Я хочу, чтобы задержка в моей игре tic tac toe. Это должно выглядеть так, как будто ИИ думает. На моей этикетке thinkingLabel я хочу отобразить следующую строку "Thinking…" во время задержки. После задержки (AI сделал ход) метка должна исчезнуть.Есть ярлык с задержкой в ​​Swift

Есть ли способ для последовательности dispatch_after Я использовал для выполнения двух функций, мой поворот AI и смена метки после задержки? Есть ли лучший подход?

Вот код, который я использовал для задержки:

checkforWin() 
let delay = 1 * Double(NSEC_PER_SEC) 
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
dispatch_after(time, dispatch_get_current_queue(), { 
    self.aiTurn() 
}) 

ответ

0

Да. Вы можете иметь несколько операторов внутри закрытия (все внутри {}).

dispatch_after(time, dispatch_get_current_queue(), { 
self.aiTurn() 
println("another statement") 
self.anotherMethod() 
}) 

Полное закрытие будет выполнено после задержки. Если у вас есть куча операторов внутри закрытия, он может выглядеть более чистым, если вы используете синтаксис трейлинг-закрытия.

dispatch_after(time, dispatch_get_current_queue()){ 
    self.aiTurn() 
    println("another statement") 
    self.anotherMethod() 
} 

В качестве примечания: у вас есть какие-либо основания для использования dispatch_get_current_queue вместо dispatch_get_main_queue? Первый из них устарел и, кажется, был удален в бета-версии 3.

1

Да, конечно. Блок передается dispatch_after может иметь произвольное число строк:

checkforWin() 
let delay = 1 * Double(NSEC_PER_SEC) 
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 

dispatch_after(time, dispatch_get_current_queue(), { 
    self.aiTurn() 
    // more lines here 
}) 

Однако, если вы собираетесь обновлять пользовательский интерфейс внутри вашего блока, помните, что все обновления какао интерфейса должны происходить в основном потоке. Ваша самая безопасная ставка - использовать dispatch_get_main_queue вместо dispatch_get_current_queue.

+0

Хорошо, спасибо. Я перешел на dispatch_get_main_queue. Это сработало, только у меня все еще есть проблема - сообщение печатается на ярлык после перемещения, и мне нужно, чтобы он появлялся ТОЛЬКО, когда задержка происходит и исчезает после того, как ИИ делает свой ход так, что компьютер " мышления». Есть идеи? – skyguy

+0

Сделайте свой ярлык перед 'dispatch_after' и заставьте его исчезнуть на линии после' self.aiTurn() '. – Jason

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