计时器:如何在后台保持计时器处于活动状态
Posted
技术标签:
【中文标题】计时器:如何在后台保持计时器处于活动状态【英文标题】:Timer: how to remain timer active in Background 【发布时间】:2011-12-23 07:47:18 【问题描述】:在我的 iPhone 计时器应用程序中,
计时器应该在后台运行。
所以, 我已经在 appdelegate 中设置了通知,它工作得很好...... 有了这个,我从视图控制器调用方法,使计时器活着。
看看一些代码...
应用委托
- (void)applicationDidEnterBackground:(UIApplication *)application
/*
Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
*/
NSLog(@"Time Remaining %d",(self.viewController.totalSeconds-self.viewController.totalCount));
[self.viewController selectandnotify:(self.viewController.totalSeconds-self.viewController.totalCount)];
[self.viewController stopTimer];
[self.viewController startTimerAction];
这里我调用的是我的视图控制器中的方法 startTimerAction 方法...看看这个...
-(void)startTimerAction
timer_main = [NSTimer scheduledTimerWithTimeInterval:(1.0) target:self selector:@selector(ShowActicity) userInfo:nil repeats:YES];
NSTimer 是什么
每次都在这里
-ShowActivity 方法将在每秒后调用...在我的视图控制器中如下...
-(void)ShowActicity
NSLog(@"Total Counts %d",totalCount);
if (totalCount == totalSeconds)
if ([timer_main isValid])
[timer_main invalidate];
isTimeOver = YES;
[self generateLog];
else
totalCount++;
seconds =seconds + 1;
if(seconds > 59)
minutes = minutes + 1;
seconds= 0;
如何每次从视图控制器调用这个方法.....
如何每次从 appdelegate 调用 showActivity 方法...
我应该为此使用委托
我应该在我的 Appdelegate 中创建 showActivity 和计时器吗..
其实我希望这个应用程序在应用中的视图切换时运行.....
我认为如果我让委托是一个不错的选择?
任何其他方式....请有一些建议
【问题讨论】:
【参考方案1】:一般使用这段代码进行后台运行。在后台计时器不起作用
- (void)applicationDidEnterBackground:(UIApplication *)application
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
// Do the work associated with the task.
[self startTimerAction];
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
);
http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW3
【讨论】:
谢谢萨钦这是一个很好的答案,我的问题完美解决了......再次感谢...... 抱歉迟到的 bgTask 是 UIBackgroundTaskIdentifier 类型 @Tendulkar 你能看一下吗:***.com/questions/30635723/…以上是关于计时器:如何在后台保持计时器处于活动状态的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序处于后台时,在反应本机后台计时器 setInterval 中调用 await