iPhone SDK:在后台调用函数?
在iPhone SDK开发中,是否可以在后台以编程方式在一定间隔后调用my函数?在我的应用程序运行期间,我想在特定的时间间隔(可能是每10分钟)在后台调用一个特定的函数 你能分享一下你的想法吗 谢谢iPhone SDK:在后台调用函数?,iphone,Iphone,在iPhone SDK开发中,是否可以在后台以编程方式在一定间隔后调用my函数?在我的应用程序运行期间,我想在特定的时间间隔(可能是每10分钟)在后台调用一个特定的函数 你能分享一下你的想法吗 谢谢 Clave/你可以有一个计时器,看看每10分钟触发一次的NSTimer,为了让它在后台发生,你有几个选项,我举两个。 首先要注意的是,任何UI工作都不应该在另一个线程中完成,因为UIKit不是线程安全的 您可以将NSThread子类化,并使用它在后台进行处理 您可以使用NSObjects perf
Clave/你可以有一个计时器,看看每10分钟触发一次的NSTimer,为了让它在后台发生,你有几个选项,我举两个。 首先要注意的是,任何UI工作都不应该在另一个线程中完成,因为UIKit不是线程安全的
- 您可以将NSThread子类化,并使用它在后台进行处理
- 您可以使用NSObjects performSelectorInBackground方法,该方法基本上创建一个线程并执行该方法。以下是参考资料:
要在主线程上调用函数,请使用NSTimer
要在另一个线程上调用它,请创建一个NSOperation并设置一个NSOperationQueue来调用它。最简单的方法是在主线程运行循环上安排一个
NSTimer
。我建议在您的应用程序代理上实现以下代码,并且您可以从applicationdifinishlaunching:
调用setupTimer
-(void)setupTimer;
{
NSTimer* timer = [NSTimer timerWithTimeInterval:10 * 60
target:self
selector:@selector(triggerTimer:)
userInfo:nil
repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
-(void)triggerTimer:(NSTimer*)timer;
{
// Do your stuff
}
如果您在这里的资料需要很长时间,并且您无法挂起主线程,请使用以下方法调用您的资料:
[self performSelectorInBackground:@selector(myStuff) withObject:nil];
或者您可以在后台线程上运行NSTimer
,方法如下(我有意泄漏线程对象):
通常,NSTimer应该只在可以确定具有runloop的线程上调度(不能保证performSelectorInBackground会在具有runloop的线程上调用选择器)。对于手动创建的线程或performSelectorInBackground,可以立即启动线程并睡眠,或者在主线程上安排计时器,然后仅在计时器启动时启动后台线程。您好,它对我不起作用。在我的例子中,我尝试在后台运行计时器(这意味着当应用程序转到后台时,我想运行计时器和一些方法)。你能帮我吗?@peylow即使我们没有关闭我们的应用程序,但按home按钮并在另一个应用程序上工作,它也会启动。是否可能。如果可能,那么运行后台线程触发的时间有任何限制。请指导我。谢谢
-(void)startTimerThread;
{
NSThread* thread = [[NSThread alloc] initWithTarget:self
selector:@selector(setupTimerThread)
withObject:nil];
[thread start];
}
-(void)setupTimerThread;
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSTimer* timer = [NSTimer timerWithTimeInterval:10 * 60
target:self
selector:@selector(triggerTimer:)
userInfo:nil
repeats:YES];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forModes:NSRunLoopCommonModes];
[runLoop run];
[pool release];
}
-(void)triggerTimer:(NSTimer*)timer;
{
// Do your stuff
}