Objective c iOS4创建后台计时器

Objective c iOS4创建后台计时器,objective-c,ios4,localnotification,background-thread,Objective C,Ios4,Localnotification,Background Thread,我(基本上)需要在iOS4上创建一个后台计时器,当特定的时间过去后,它将允许我执行一些代码。我已经读到,您可以使用一些[NSThread detachNewThreadSelector: 目标: withObject:

我(基本上)需要在iOS4上创建一个后台计时器,当特定的时间过去后,它将允许我执行一些代码。我已经读到,您可以使用一些
[NSThread detachNewThreadSelector:
目标:
withObject:

谢谢你的帮助

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


现在,如果您想执行延迟的任务,最好的方法可能是执行选择器:withObject:afterDelay:
,如果您想在后台运行任务,请调用
detachNewThreadSelector:toTarget:withObject:

,您也可以使用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];
    });
}); 
#导入
…
n时间间隔延迟(单位:秒)=3.0;
调度时间延迟=调度时间(现在调度时间,以秒为单位的延迟*每秒纳秒);
调度队列=调度获取全局队列(调度队列优先级默认为0);
UIImageView*imageView=tableViewCell.imageView;
//切换应用程序时,确保应用程序保持清醒足够长的时间以完成任务
UIBackgroundTaskIdentifier taskIdentifier=[[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:{}];
在(延迟、队列、^{
//在这里执行后台任务。这是一个块,因此可以在这里引用调用方法中可用的变量。
UIImage*image=[自绘图像];
//现在在主线程上分派一个新块,以更新我们的UI
dispatch_async(dispatch_get_main_queue(),^{
imageView.image=图像;
[[UIApplication sharedApplication]endBackgroundTask:taskIdentifier];
});
}); 
中央总调度(GCD)参考:

区块参考:

背景任务参考:

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


我假设如果一个应用程序不能合法地声称是voip/音乐/位置感知应用程序,那么如果它实现了这里描述的内容,那么当时间间隔到期时,它将不会执行?

beast方法:)Ok,因此,如果我使用
detachNewThreadSelector:toTarget:withObject:
创建一个线程,它会留在后台吗?jajaja,对“beast”方法感到抱歉=/Yes,它将与主线程并行执行,请查看NSObject中的
performSelector
方法,以获取完整的可能性列表。真棒的人,非常感谢,我一直在拔头发!:)不,这是不正确的,但是,应用程序仍然运行的可能性很小,这取决于您设置的时间。当你有一个voip/music/location应用程序时,操作系统通常会尝试让它无论发生什么都保持运行,而不是停止进程以释放资源。但是这个调度在后台不起作用。要检查相同的代码,请将代码放入applicationidenterbackground:method中,查看是否调用了块。非常好的建议是执行此后台任务。我会尽量多记的。