ожидание в фиксированном месте в коде для прикосновения к экрану - PullRequest
0 голосов
/ 18 июля 2011

Например, в потоке (потому что я не могу ждать в основном цикле) у меня есть этот код:

-(void) game {
for (Players player in players) {
    if (player.type == IA) {        // computer plays
        answer = [player play];
    else {
         [ui showQuestion];          // user plays with the touch screen
         // here waiting for the answer touch 
         answer = ????????????????   // return from waiting after touch callback

     }
     [answersArray addObject:answer];
}
answer = [self bestAnswer : answersArray];
[ui showTheBestAnswer : answer];

}

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

Большое спасибо за вашу помощь, jpdms

1 Ответ

1 голос
/ 18 июля 2011

Прежде всего, я настоятельно рекомендую вам прочитать Руководство по программированию параллелизма 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)];

Вы действительно, действительно, действительно не должны использовать отдельную ветку для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...