如何使 NSTimer 失效 Which one 运行 in loop?

How to invalidate NSTimer Which one running in loop?

我想以不同的时间表播放声音,例如每 3 次、每 5 次、9 次之后、22 次之后...等等,所以我创建了一个 for 循环并像这样传递不同的 -2 scheduledTimerWithTimeInterval 。

    -(void)bellsSchedual{

        arrBellsListAllData=[EMeditationDBModel getDataFromBellsList:prop.userId];
        EMeditationDBProperty *bellProp=[[EMeditationDBProperty alloc]init];
       for (int i=0; i<arrBellsListAllData.count; i++)
       {
        bellProp=[arrBellsListAllData objectAtIndex:i];

        NSString *bellsTime=bellProp.bTime;
        if ([bellProp.bTimeSchedule isEqualToString:@"after"]) {

               bellTimer= [NSTimer scheduledTimerWithTimeInterval:          [bellsTime intValue] target: self
                                                         selector: @selector(playSound:) userInfo:nil repeats: NO];

}
  else if ([bellProp.bTimeSchedule isEqualToString:@"every"]){

        bellTimer=[NSTimer scheduledTimerWithTimeInterval:[bellsTime intValue] target: self
                                                         selector: @selector(playSound:) userInfo:nil repeats: YES]; 

        }
   }
}

问题是我的计时器不是 invalidate.if for loop 运行 only only once that time timer invalidate .

    -(void)bellsSchedual {

    arrBellsListAllData = [EMeditationDBModel getDataFromBellsList:prop.userId];
    EMeditationDBProperty *bellProp = [[EMeditationDBProperty alloc] init];
    for (int i=0; i<arrBellsListAllData.count; i++) {
        bellProp = [arrBellsListAllData objectAtIndex:i];
        NSString *bellsTime = bellProp.bTime;
        if ([bellProp.bTimeSchedule isEqualToString:@"after"]) {
            [NSTimer scheduledTimerWithTimeInterval:[bellsTime intValue]
                                             target:self
                                           selector:@selector(playSound:)
                                           userInfo:nil
                                            repeats:NO];
        } else if ([bellProp.bTimeSchedule isEqualToString:@"every"]){
            [NSTimer scheduledTimerWithTimeInterval:[bellsTime intValue] target: self
                                             target:self
                                           selector:@selector(playSound:)
                                           userInfo:nil
                                            repeats:YES];
        }
    }
}

我认为你应该采用 NSTimers 数组的方法

某处,大部分在您的 viewDidLoad 中

NSMutableArray *arrTimers = [[NSMutableArray alloc] init]

在你的代码中

for (int i=0; i<arrBellsListAllData.count; i++)
{
    bellProp=[arrBellsListAllData objectAtIndex:i];
    NSString *bellsTime=bellProp.bTime;
    if ([bellProp.bTimeSchedule isEqualToString:@"after"]) {

         NSTimer *bellTimer= [NSTimer scheduledTimerWithTimeInterval:[bellsTime intValue] target: self
                                                         selector: @selector(playSound:) userInfo:nil repeats: NO]

        [arrTimers addObject:bellTimer];
    }
    else if ([bellProp.bTimeSchedule isEqualToString:@"every"]){

         NSTimer *bellTimer=[NSTimer scheduledTimerWithTimeInterval:[bellsTime intValue] target: self
                                                         selector: @selector(playSound:) userInfo:nil repeats: YES];
         [arrTimers addObject:bellTimer]; 

    }
}

循环失效

-(void) invalidateAllTimers{
    for( NSTimer *timer in arrTimers) {
       [timer invalidate];
    }
}

如果您想使特定计时器无效,请使用

[NSTimer scheduledTimerWithTimeInterval:[bellsTime intValue]
                                             target:self
                                           selector:@selector(playSound:)
                                           userInfo:anyId
                                            repeats:NO];

在 userInfo 对象中传递任何标识符以查找任何特定计时器。