gpt4 book ai didi

ios - 当触发时间可能改变时,如何使用自动计划的 Action 来触发?

转载 作者:行者123 更新时间:2023-11-28 22:51:21 25 4
gpt4 key购买 nike

在某个 View 中,我希望在触发时间基于 NSTimeIntervals 数组(我将其作为 NSArray 保存 double 值)时触发某个方法。

所以我有一个根据相关时间执行相关操作的方法,在这个方法中我调用相同的方法(递归地)在下一个预定时间再次触发:

-(void) actionMethod:(int)someDataINeed {

//do something and then...

if (someDataINeed == someDefinitionIHaveToBreakTheLoop) {
return;
}

double nextFire = [self aMethodThatCalculatesTheNextFiringTime];
NSNumber * nextDataINeed = [NSNumber numberWithInt:someDataINeed+1];

NSTimer * aTimer = [NSTimer scheduledTimerWithTimeInterval:nextFire
target:self
selector:@selector(actionMethod:)
userInfo:nextDataINeed
repeats:NO];
}

好吧……它不起作用(如果它起作用,我想我不会问这个问题……)。当我使用 NSLog 时,似乎时间根本没有运行,并且计时器在某种循环中被调用,而不是根据我定义的时间“被触发”。 nextFire double 数据是正确的(根据我的定义)。

如果我做错了,如果有人能指导我如何执行此类操作,我将不胜感激。

如果我做对了,但只是写错了,也将不胜感激捕获我的“错误”的眼睛...

最佳答案

不是内存管理问题

当您安排 NSTimer 实例时,运行循环会保留计时器,因此无需担心自己保留它(ARC 与否)。

定时器也保留了它的目标,所以你不必担心目标先被释放的情况。但是,如果目标是一个 View ,它可能会在从 View 层次结构中删除后收到一条计时器消息。在这种情况下,您将希望忽略该消息。

您可以通过两种方式处理:

  1. 在您的actionMethod 中,请务必检查您是否仍要执行该操作。如果没有,请忽略该消息并让所有内容清理干净。

  2. 保留对计时器实例的引用,并在您不想再接收计时器消息时调用[timer invalidate]

如果您可以确定目标始终在附近并且接收消息总是可以的,则您无需执行任何操作。例如,您的应用程序委托(delegate)对象将在您的应用程序的整个生命周期内存在。

NSTimer 的目标 Action

您不能将计时器设置为只调用任何对象上的任何方法。计时器方法必须只接受一个参数,即发送消息的 NSTimer 实例。您已经定义了 actionMethod: 来获取一个 int,它实际上会编译并执行,但是当计时器触发并调用该方法时,someDataINeed< 的值 将是 NSTimer 对象的内存地址。这不是很有用。

你需要这样定义你的方法:

- (void)actionMethod:(NSTimer *)timer

要获取 someDataINeed 值,您可以将其保存为定时器的 userInfo 中的 NSNumber。它在那里只是为了让您可以向计时器添加一些数据。

    NSNumber *number = [timer userInfo];
int someDataINeed = [number intValue];

创建计时器时,可以将 nextDataINeed 包装到 NSNumber 中,并以这种方式设置 userInfo:

    currentTimer = [NSTimer scheduledTimerWithTimeInterval:nextFire 
target:self
selector:@selector(actionMethod:)
userInfo:[NSNumber numberWithInt:nextDataINeed]
repeats:NO];

您需要使用 NSNumber,因为 userInfo 必须是一个对象。

可能的错误

如果应用上述方法不能解决问题,需要检查的一件事是 aMethodThatCalculatesTheNextFiringTime 正在返回自现在以来的时间间隔,而不是自引用日期以来的时间间隔。如果您希望计时器在三秒内触发,nextFire 的值必须为 3.0。如果您不小心调用了 timeIntervalSinceReferenceDate,您会得到一个巨大的数字,并且计时器将被安排在未来几年触发。

关于ios - 当触发时间可能改变时,如何使用自动计划的 Action 来触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11922496/

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