gpt4 book ai didi

ios - 第二个 NSTimer 不工作?

转载 作者:行者123 更新时间:2023-11-28 18:34:33 25 4
gpt4 key购买 nike

我以前有一个工作正常的 NSTimer。我已将另一个 NSTimer 添加到我的运行循环中,因为现在我需要在延迟后重复调用两个函数。两种功能都有不同的延迟。我的代码如下。

self.now = [NSDate date] ;
self.timer = [[NSTimer alloc] initWithFireDate:self.now
interval:500
target:self
selector:@selector(Func1)
userInfo:nil
repeats:YES] ;

self.runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:self.timer forMode:NSDefaultRunLoopMode];
[self.runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10000]];


//Second timer start here.its not working.The function 'func2' is not getting called

self.now = [NSDate date] ;
self.timer = [[NSTimer alloc] initWithFireDate:self.now
interval:60
target:self
selector:@selector(Func2)
userInfo:nil
repeats:YES] ;

self.runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:self.timer forMode:NSDefaultRunLoopMode];
[self.runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10000]];

第一个 NSTimer 仍在工作,但第二个 NSTimer 不工作。

最佳答案

虽然覆盖您的属性并不好(它不会影响计时器单独运行的能力,但这只是意味着您在设置第二个计时器时丢弃了对第一个计时器的引用,因此你失去了invalidate第一个计时器的能力,如果你需要这样做的话),关键问题是你正在调用runUntilDate。没有必要这样做,第一个 runUntilDate 阻止了第二个计时器的创建,因为 viewDidLoad 不会在第一个 runUntilDate 之后继续进行> 打电话。

因此删除对 runUntilDate 的两个调用,两个计时器都将正常工作。如果您想保留对这两个计时器的引用,请使用不同的属性来保存对这两个计时器的引用,以便您可以在不再需要它们时分别使它们无效。 (重要的是当你不再需要它们时,你要invalidate它们,因为它们保持对self的强引用,这意味着你有一个“强引用循环”。)


您可以简化代码示例:

NSDate *date = [NSDate date];

self.timer1 = [[NSTimer alloc] initWithFireDate:date
interval:500
target:self
selector:@selector(method1:)
userInfo:nil
repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:self.timer1 forMode:NSRunLoopCommonModes];

self.timer2 = [[NSTimer alloc] initWithFireDate:date
interval:60
target:self
selector:@selector(method2:)
userInfo:nil
repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:self.timer2 forMode:NSRunLoopCommonModes];

或者,除非你真的需要 NSRunLoopCommonModes,否则你可以这样做:

self.timer1 = [NSTimer scheduledTimerWithTimeInterval:500
target:self
selector:@selector(method1:)
userInfo:nil
repeats:YES];

self.timer2 = [NSTimer scheduledTimerWithTimeInterval:60
target:self
selector:@selector(method2:)
userInfo:nil
repeats:YES];

请注意,我正在使用带有参数的方法(因此带有选择器的冒号):

- (void)method1:(NSTimer *)timer
{
// do whatever
}

- (void)method2:(NSTimer *)timer
{
// do whatever
}

关于ios - 第二个 NSTimer 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21621733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com