NSTimer и NSInvocation, таймер не срабатывает

Сначала я создаю NSInvocation, потому что метод, который я хочу вызвать с помощью таймера, имеет несколько параметров, которые я установил здесь.

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(addStockPriceForArticle:forInterval:)]];
[invocation setArgument:&varArticle atIndex:2];
NSNumber *interval = [NSNumber numberWithInt:60];
[invocation setArgument:&interval atIndex:3];

В документации сказано, что при установке аргументов нужно начинать с индекса 2, потому что индексы 0 и 1 являются целью и селектором.

Затем я вычисляю интервал, который я хочу, чтобы таймер был. В этом случае я вызываю таймер через 60 минут после публикации статьи, поэтому интервал составляет 60 - timeSincePubDate в минутах, которые я умножаю на 60, чтобы получить интервал в секундах для таймера.

int timeUntilCheck = (60-timeSincePubDate)*60;

Затем я создаю таймер с интервалом и добавляю его в цикл выполнения. Я никогда не делал этого раньше, но это кажется достаточно простым; Я не уверен, почему он никогда не вызывает метод, который должен.

[[NSRunLoop currentRunLoop] addTimer:[NSTimer timerWithTimeInterval:timeUntilCheck invocation:invocation repeats:NO]
                                     forMode:NSDefaultRunLoopMode];

person Regan    schedule 12.07.2013    source источник
comment
Вы делаете это в основной теме?   -  person jscs    schedule 13.07.2013
comment
Xcode сообщает мне, что это делается в потоке 5, com.apple.root.default-priority. Я предполагаю, что это происходит в ответ на асинхронный запрос HTML для RSS-канала.   -  person Regan    schedule 13.07.2013


Ответы (1)


Вам нужно добавить таймер в цикл выполнения, который а) существует и б) работает, иначе он никогда не сработает, и вы, вероятно, хотите, чтобы ваш обратный вызов все равно происходил в основном потоке.

Добавьте таймер в цикл выполнения основного потока следующим образом:

[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:timeUntilCheck invocation:invocation repeats:NO]
                             forMode:NSDefaultRunLoopMode];
person jscs    schedule 12.07.2013