Прежде всего, я настоятельно рекомендую вам прочитать Руководство по программированию параллелизма Apple , включенное в документацию Xcode. В общем, есть гораздо лучшие альтернативы потокам, особенно в приведенном вами примере.
Тем не менее:
Если метод game
выполняется в отдельном потоке, то правильный способ сообщить потоку использует NSCondition
. Создайте экземпляр и убедитесь, что к нему есть код, указанный выше, и сенсорный обработчик.
NSCondition *playerDidTouchCondition = [[NSCondition alloc] init];
В методе game
вы ждете при таком условии:
[ui showQuestion];
[playerDidTouchCondition lock];
[playerDidTouchCondition wait];
[playerDidTouchCondition unlock];
// do something with answer
Ваш игровой поток будет спать до тех пор, пока не будет указано условие. В вашем сенсорном обработчике вы бы сделали это:
answer = whatever the user did
[playerDidTouchCondition lock];
[playerDidTouchCondition signal]; // wake up one of the sleeping threads
[playerDidTouchCondition unlock];
Однако приведенный выше пример кода не демонстрирует необходимости в отдельном потоке. Вы можете очень легко сохранить где-нибудь currentPlayerIndex
и перейти к следующему игроку внутри обработчика кнопки для кнопки ответа.
Кроме того, вы ДОЛЖНЫ убедиться, что любые обновления пользовательского интерфейса действительно происходят в основном потоке. Я надеюсь, что ваши линии, такие как [ui showQuestion]
, являются очередями вызовов в главном потоке. В Какао вы можете сделать это легко с чем-то вроде: [ui performSelectorOnMainThread:@selector(showQuestion)];
Вы действительно, действительно, действительно не должны использовать отдельную ветку для этого.