iPhone SDK:在后台调用函数?

iPhone SDK:在后台调用函数?,iphone,Iphone,在iPhone SDK开发中,是否可以在后台以编程方式在一定间隔后调用my函数?在我的应用程序运行期间,我想在特定的时间间隔(可能是每10分钟)在后台调用一个特定的函数 你能分享一下你的想法吗 谢谢 Clave/你可以有一个计时器,看看每10分钟触发一次的NSTimer,为了让它在后台发生,你有几个选项,我举两个。 首先要注意的是,任何UI工作都不应该在另一个线程中完成,因为UIKit不是线程安全的 您可以将NSThread子类化,并使用它在后台进行处理 您可以使用NSObjects perf

在iPhone SDK开发中,是否可以在后台以编程方式在一定间隔后调用my函数?在我的应用程序运行期间,我想在特定的时间间隔(可能是每10分钟)在后台调用一个特定的函数

你能分享一下你的想法吗

谢谢


Clave/

你可以有一个计时器,看看每10分钟触发一次的NSTimer,为了让它在后台发生,你有几个选项,我举两个。 首先要注意的是,任何UI工作都不应该在另一个线程中完成,因为UIKit不是线程安全的

  • 您可以将NSThread子类化,并使用它在后台进行处理

  • 您可以使用NSObjects performSelectorInBackground方法,该方法基本上创建一个线程并执行该方法。以下是参考资料:

此处为NSThread引用

这里是NSTimer引用
要在主线程上调用函数,请使用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
}