вопрос темы - PullRequest
       21

вопрос темы

0 голосов
/ 22 июня 2011

Я подключен к методу SpringBoard, я хочу подождать, пока не произойдет определенное событие, а затем продолжить мой код, но что бы я ни пытался - я думаю, что он останавливает основной поток, и тогда все потоки останавливаются.Мой код:

+(void) startc {
    while([currentNumber isEqual:@""])
    {
        NSLog(@"waiting until currentNumber is not empty %@", currentNumber);
    }
}

id replaced_SBCallAlert_initWithCall_(id self, SEL _cmd, CTCallRef call) {  // Note the 
        NSLog(@"calling replaced");
            [cdBackground startc];
        original_SBCallAlert_initWithCall_(sbc, scc, cls); 
            return NULL;
    }

currentNumber обновляется в другом потоке, но этот код блокирует его.

1 Ответ

1 голос
/ 22 июня 2011

Ваш цикл while в startc фактически является спин-блокировкой и будет препятствовать дальнейшему продвижению потока, выполняющего его, пока currentNumber не станет @"".Если этот же поток отвечает за изменение currentNumber, тогда да - у вас тупик.Похоже, что это именно тот случай, так как я предполагаю, что вы ожидаете, что вызов original_SBCallAlert_initWithCall_ изменит эту переменную, но застряли внутри startc вызова предыдущей строки.

В этом случае выдолжны изменить способ разработки вашей программы.Вы можете поместить startc в фоновый поток (смотрите NSThread) и использовать другую спин-блокировку, NSCondition или наблюдение значения ключа, чтобы "проснуться", когда currentNumber изменилось.Затем вы можете использовать NSObject performSelectorOnMainThread … (при условии, что у вас есть runloop), чтобы снова запустить ваш код в «основном» потоке или продолжить в фоновом потоке.

...