Подтвердить что ты не робот

NSTimer не запускает селектор

В ios5.0 с ARC в моем контроллере rootview я вызываю метод в объекте диспетчера безопасности, который хранится делегатом приложения. В этом методе я настраиваю таймер как ниже

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self 
                                       selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

Однако это никогда не срабатывает селектор, т.е. updateModel: никогда не вызывается. Что может быть неправильным? Есть ли еще один эффективный способ сделать это без использования NStimer?

4b9b3361

Ответ 1

Кажется, вы немного перепутали свою переменную таймера.

Вы инициализируете новый таймер, но на самом деле его не используете. Вы хотите использовать инициализированный таймер или хотите ли вы использовать ApplicationDelegate.timer?

Вот два возможных решения.

Вариант один (предполагая, что у вас есть экземпляр класса под названием ApplicationDelegate и что у него есть свойство таймера):

ApplicationDelegate.timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:ApplicationDelegate.timer forMode:NSRunLoopCommonModes];

Вариант второй:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

Ответ 2

Также может быть проблема с потоками:

если

[NSThread isMainThread]

false, тогда запустите таймер следующим образом:

dispatch_async(dispatch_get_main_queue(), ^{
        timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick:) userInfo:nil repeats:YES];
    })

Ответ 3

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

[NSURLConnection sendAsynchronousRequest:request queue:_operationQueue
    completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
         [self loopUpUpdateStart];
}];

-(void)loopUpUpdateStart{
    dispatch_async(dispatch_get_main_queue(), ^{

        _loopTimerForUpRevision = 
          NSTimer scheduledTimerWithTimeInterval: kNetworkLoopIntervalUpRev
                                          target: self
                                        selector: @selector(myCoolMethod)
                                        userInfo: nil
                                         repeats: YES];
        TRACE(@"Start Up updates");
    });
}

Ответ 4

В этой строке есть несколько проблем:

[[NSRunLoop currentRunLoop] addTimer:ApplicationDelegate.timer forMode:NSRunLoopCommonModes]; 

Во-первых, это не требуется вообще. -scheduledTimerWithTimeInterval:... уже добавляет таймер в runloop. Вам не нужно добавлять его снова.

Во-вторых, локальная переменная timer не связана с свойством ApplicationDelegate.timer (которое предположительно nil в этой точке).

Если вы так много говорите с делегатом приложения, что создали что-то под названием ApplicationDelegate (глобальный? макрос?), вы слишком много говорите с ним. Делегат приложения является делегатом для приложения; он помогает в запуске и остановке приложения и реагировании на события системы. Делегат приложения не является местом хранения глобальных переменных. Таймер определенно не та вещь, которую вы могли бы извлечь из другого объекта в любом случае.