У меня была похожая проблема, и у нее была другая основная причина, связанная с циклом выполнения.Стоит отметить, что при планировании таймера с кодом:
updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.01428 target:self selector:@selector(GameUpdate) userInfo:nil repeats:YES];
Таймер будет запланирован с использованием текущего цикла current потока.В вашем случае, потому что вы делаете этот вызов в viewDidLoad, это основной поток, так что вы готовы идти.
Однако, если вы планируете свой таймер с потоком, отличным от основного потока, онбудет запланировано в runLoop для этого потока, а не основного.Это нормально, но во вспомогательных потоках вы несете ответственность за создание и запуск начального цикла выполнения, поэтому, если вы этого не сделали, ваш обратный вызов никогда не будет вызван.
Решение состоит в том, чтобы либо запуститьrunLoop для вашего вспомогательного потока или для отправки запуска по таймеру в основной поток.
для отправки:
dispatch_async(dispatch_get_main_queue(), ^{
updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.01428 target:self selector:@selector(GameUpdate) userInfo:nil repeats:YES];
});
Чтобы запустить цикл запуска:
После создания потокаиспользуя выбранный вами API, вызовите CFRunLoopGetCurrent (), чтобы выделить начальный цикл выполнения для этого потока.Любые будущие вызовы CFRunLoopGetCurrent будут возвращать тот же цикл выполнения.
CFRunLoopGetCurrent();
updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.01428 target:self selector:@selector(GameUpdate) userInfo:nil repeats:YES];