iOS4创建后台计时器

时间:2010-11-11 12:22:22

标签: objective-c ios4 localnotification background-thread

我(基本上)需要在iOS 4上创建一个后台计时器,这将允许我在经过特定时间后执行一些代码。我已经读过你可以使用[NSThread detachNewThreadSelector: toTarget: withObject:];来完成这个任务,但是这在实践中是如何工作的?如何确保线程也保留在后台。本地通知将 NOT 为我工作,因为我需要执行代码,而不是通知用户。

帮助将不胜感激!

3 个答案:

答案 0 :(得分:20)

您也可以使用Grand Central Dispatch(GCD)执行此操作。这样,您可以使用块将代码保存在一个位置,并确保在完成后台处理后需要更新UI时再次调用主线程。这是一个基本的例子:

#import <dispatch/dispatch.h>

…

NSTimeInterval delay_in_seconds = 3.0;
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delay_in_seconds * NSEC_PER_SEC);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

UIImageView *imageView = tableViewCell.imageView;

// ensure the app stays awake long enough to complete the task when switching apps
UIBackgroundTaskIdentifier taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:{}];

dispatch_after(delay, queue, ^{
    // perform your background tasks here. It's a block, so variables available in the calling method can be referenced here.        
    UIImage *image = [self drawComplicatedImage];        
    // now dispatch a new block on the main thread, to update our UI
    dispatch_async(dispatch_get_main_queue(), ^{        
      imageView.image = image;
      [[UIApplication sharedApplication] endBackgroundTask:taskIdentifier];
    });
}); 

Grand Central Dispatch(GCD)参考: http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

块参考: http://developer.apple.com/library/ios/#featuredarticles/Short_Practical_Guide_Blocks/index.html%23//apple_ref/doc/uid/TP40009758

后台任务参考: http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler

答案 1 :(得分:4)

您可以使用这些调用在新线程(detachNewThred)中使用某个参数(withObject)执行对象(toTarget)的方法(选择器)。

现在,如果你想执行延迟任务可能是最好的方法performSelector: withObject: afterDelay:,如果你想在后台运行任务detachNewThreadSelector: toTarget: withObject:

答案 2 :(得分:0)

这些建议的方法是否仅适用于首先启用后台执行应用程序(使用UIBackgroundMode)?

我认为一个应用程序不能合法声称是一个voip /音乐/位置感知应用程序然后如果它实现了这里描述的内容,它将在时间间隔到期时执行?