我的 NSTimers 和后台选择器一直遇到问题。这让我抓狂,并且需要很长时间来尝试每一个调整。为了保持我的理智以及未来几代可可程序员的理智,我问这个问题:
是否有绝对 100% 确定的方法可以在稍后的时间点触发预定的长期计时器,无论它是否是从后台线程、主线程等调用的?
对于大多数使用 NSTimers 的类,我似乎不得不一遍又一遍地解决同样的问题。它们在短期测试期间工作,假设我将计时器设置为通过后台线程在 10 秒内触发。它有效,因为仍然有一个运行循环在运行。但一旦我将点火时间更改为我真正想要的时间(例如 15-30 分钟),就会一片死寂。运行循环消失了,我不知道如何处理这种情况。什么也没发生,几天后我发现了这样的错误,一旦我已经忘记了哪个计时器会对此负责。
目前我正在与选择器做一些非常非常丑陋的舞蹈,例如这里有一个测试方法(它似乎适用于 10 分钟计时器):
//this is a test method to simulate a background task requesting a timer
[self performSelectorInBackground:@selector(backgroundReminderLongTermTest:) withObject:nil];
//this is a method similar to the one that the background thread would be trying to invoke
-(void)backgroundReminderLongTermTest:(id)sender
{
[self performSelectorOnMainThread:@selector(backgroundReminderFromMainThread:) withObject:nil waitUntilDone:NO];
}
//this is a wrapper for the background method, I want the timer to be added to a thread with a run loop already established and running
-(void)backgroundReminderFromMainThread:(id)sender
{
[playTimers addObject:[NSTimer scheduledTimerWithTimeInterval:1800 target:self selector:@selector(start:) userInfo:nil repeats:NO]];
}
我喜欢这样的便利,不必担心使用预定的计时器创建触发日期对象,但我是否应该忘记它们并使用具有特定触发日期的计时器?当运行循环已经存在时,scheduledTimer 似乎适用于短期任务,但我在应用程序执行期间根本看不到这种错误。在某个时刻,计时器似乎正常触发,但在稍后的某个时刻,它们完全停止触发。
感谢您的任何帮助或澄清。我正在寻找一种安排计时器的方法,而不必担心每次需要安排计时器时是否存在运行循环。我想确保只要应用程序正在运行,通过此方法安排的计时器就会在未来的可预测点触发。
NSTimers 的众多问题之一是它们的运行循环依赖性。每个线程都有一个运行循环。如果您在后台线程上安排计时器,它将被安排在该线程的运行循环上。如果该线程的生命周期很短(后台线程通常是这样),则该计时器将随之悄然消亡。
解决方案是保证计时器在一个线程上运行will当计时器触发时还活着。根据我的经验,执行这些专用后台计时器的最佳方法是根本不使用 NSTimer,而使用 GCD 计时器。比我更好的人已经编写了 GCD 驱动的计时器。我个人比较喜欢迈克·阿什的文章和实现,并附有解释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)