如何使 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 对象中传递任何标识符以查找任何特定计时器。
我想以不同的时间表播放声音,例如每 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 对象中传递任何标识符以查找任何特定计时器。