NSTime scheduleTimerWithTimeInterval: и executeSelectorOnMainThread - PullRequest
1 голос
/ 09 марта 2011

В моем приложении для iPhone у меня есть код:

[NSTimer scheduledTimerWithTimeInterval:03.45  
                                 target:self 
                               selector:@selector(animatePickerTimer:) 
                                userInfo:picker 
                                 repeats:NO];  

[NSTimer scheduledTimerWithTimeInterval:04.15 
                                 target:self 
                               selector:@selector(animatePickerTimer1:) 
                               userInfo:picker 
                                repeats:NO];  

[NSTimer scheduledTimerWithTimeInterval:04.91 
                                 target:self 
                               selector:@selector(animatePickerTimer2:) 
                               userInfo:picker 
                                repeats:NO]; 


-(void) animatePickerTimer: (NSTimer*) timer{
       [self performSelectorOnMainThread:@selector(animatePicker:) 
                              withObject:(UIPickerView *)timer.userInfo 
                           waitUntilDone:NO];
}

-(void) animatePickerTimer1: (NSTimer*) timer{
       [self performSelectorOnMainThread:@selector(animatePicker1:) 
                              withObject:(UIPickerView *)timer.userInfo 
                           waitUntilDone:NO];
}

-(void) animatePickerTime2r: (NSTimer*) timer{
       [self performSelectorOnMainThread:@selector(animatePicker2:) 
                              withObject:(UIPickerView *)timer.userInfo 
                           waitUntilDone:NO];
}

Потоки вызываются через некоторый интервал времени.Я хочу вызвать метод после завершения всех трех потоков.Как я могу узнать, завершены ли темы?

1 Ответ

2 голосов
/ 09 марта 2011

На самом деле есть два способа сделать это:

  1. Пусть каждый метод обратного вызова вызывает второй вспомогательный метод, который просто считает количество его вызовов.Как только количество вызовов этого метода станет равным количеству имеющихся у вас таймеров, все готово.
  2. Есть второй обратный вызов, но вместо простого подсчета таймеров сохраните каждый экземпляр NSTimer и используйте вспомогательный методотметьте isValid на каждом таймере.Когда все таймеры недействительны (т.е. больше не способны к срабатыванию), все готово.

В коде эти методы могут выглядеть примерно так:

NSInteger timersReceived = 0;

NSTimer * timer1 = [NSTimer scheduledTimerWithTimeInterval:03.45 target:self selector:@selector(animatePickerTimer:) userInfo:picker repeats:NO];  
NSTimer * timer2 = [NSTimer scheduledTimerWithTimeInterval:04.15 target:self selector:@selector(animatePickerTimer1:) userInfo:picker repeats:NO];  
NSTimer * timer3 = [NSTimer scheduledTimerWithTimeInterval:04.91 target:self selector:@selector(animatePickerTimer2:) userInfo:picker repeats:NO]; 


-(void) animatePickerTimer: (NSTimer*) timer{
       [self performSelectorOnMainThread:@selector(animatePicker:) withObject:(UIPickerView *)timer.userInfo waitUntilDone:NO];
       [self receivedTimer:timer];
}

-(void) animatePickerTimer1: (NSTimer*) timer{
       [self performSelectorOnMainThread:@selector(animatePicker1:) withObject:(UIPickerView *)timer.userInfo waitUntilDone:NO];
       [self receivedTimer:timer];
}

-(void) animatePickerTime2r: (NSTimer*) timer{
       [self performSelectorOnMainThread:@selector(animatePicker2:) withObject:(UIPickerView *)timer.userInfo waitUntilDone:NO];
       [self receivedTimer:timer];
}

// Method 1
-(void) receivedTimer: (NSTimer*) timer{
       timersReceived++;
       if(timersReceived == 3) {
              [self callMethodAfterCompletionOfAllTimers];
       }
}

// Method 2
- (void) receivedTimer: (NSTimer*) timer{
       if(![timer1 isValid] && ![timer2 isValid] && ![timer3 isValid]) {
              [self callMethodAfterCompletionOfAllTimers];
       }
}

Примечаниечто если вы используете метод 2, вы можете фактически свернуть все это до одного метода, который вы вызываете из всех трех таймеров, так как вы держитесь за ручки таймера:

NSTimer * timer1 = [NSTimer scheduledTimerWithTimeInterval:03.45 target:self selector:@selector(receivedTimer:) userInfo:picker repeats:NO];  
NSTimer * timer2 = [NSTimer scheduledTimerWithTimeInterval:04.15 target:self selector:@selector(receivedTimer:) userInfo:picker repeats:NO];  
NSTimer * timer3 = [NSTimer scheduledTimerWithTimeInterval:04.91 target:self selector:@selector(receivedTimer:) userInfo:picker repeats:NO]; 

- (void)receivedTimer:(NSTimer *)timer {
       if(timer == timer1) {
              [self performSelectorOnMainThread:@selector(animatePicker:) withObject:withObject:(UIPickerView *)timer.userInfo waitUntilDone:NO];
       } else if(timer == timer2) {
              [self performSelectorOnMainThread:@selector(animatePicker1:) withObject:withObject:(UIPickerView *)timer.userInfo waitUntilDone:NO];
       } else if(timer == timer3) {
              [self performSelectorOnMainThread:@selector(animatePicker2:) withObject:withObject:(UIPickerView *)timer.userInfo waitUntilDone:NO];
       }

       if(![timer1 isValid] && ![timer2 isValid] && ![timer3 isValid]) {
              [self callMethodAfterCompletionOfAllTimers];
       }
}

Этот комбинированный методгораздо больше в соответствии с той стратегией, которую Apple использует (например) для наблюдений значения ключа и некоторых протоколов делегатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...