NSTimer требует, чтобы я добавил его в цикл выполнения

Мне интересно, может ли кто-нибудь объяснить, почему отправка обратно в основную очередь и создание повторяющегося NSTimerмне приходится добавлять его в RUN LOOP, потому что он тоже срабатывает? Даже при использовании PerformSelectorOnMainThreadмне все равно нужно добавить его в RUN LOOP, чтобы он сработал.

Ниже приведен пример моего вопроса:

#define queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
#define mainqueue dispatch_get_main_queue()

- (void)someMethodBeginCalled
{
    dispatch_async(queue, ^{
        int x = 0;
        dispatch_async(mainqueue, ^(void){
            if([_delegate respondsToSelector:@selector(complete:)])
                [_delegate complete:nil];
        });
    });
}

- (void)compelete:(id)object
{
    [self startTimer];

    //[self performSelectorOnMainThread:@selector(startTimer) withObject:nil waitUntilDone:NO];
}

- (void)startTimer
{
    NSTimer timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(callsomethingelse) userInfo:nil repeats:YES];

    //NSDefaultRunLoopMode
    [[NSRunLoop currentRunLoop] addTimer:_busTimer forMode:NSRunLoopCommonModes];
}

РЕДАКТИРОВАТЬ: Я считаю, что очень плохо сформулировал этот вопрос. Я хотел бы знать , почему [[NSRunLoop currentRunLoop] addTimer:_busTimer forMode:NSRunLoopCommonModes];необходим в startTimer, если я вызываю someMethodBeginCalled. Если я не включу эту строку, таймер не сработает.

Если я вызову startTimerиз viewDidLoad, например, я могу удалить строку NSRunLoop, и таймер будет срабатывать каждые 60 секунд.

19
задан Honey 4 August 2017 в 15:15
поделиться