На самом деле есть два способа сделать это:
- Пусть каждый метод обратного вызова вызывает второй вспомогательный метод, который просто считает количество его вызовов.Как только количество вызовов этого метода станет равным количеству имеющихся у вас таймеров, все готово.
- Есть второй обратный вызов, но вместо простого подсчета таймеров сохраните каждый экземпляр 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 использует (например) для наблюдений значения ключа и некоторых протоколов делегатов.