Objective c iOS4创建后台计时器
我(基本上)需要在iOS4上创建一个后台计时器,当特定的时间过去后,它将允许我执行一些代码。我已经读到,您可以使用一些Objective c iOS4创建后台计时器,objective-c,ios4,localnotification,background-thread,Objective C,Ios4,Localnotification,Background Thread,我(基本上)需要在iOS4上创建一个后台计时器,当特定的时间过去后,它将允许我执行一些代码。我已经读到,您可以使用一些[NSThread detachNewThreadSelector: 目标: withObject:
[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中,查看是否调用了块。非常好的建议是执行此后台任务。我会尽量多记的。