gpt4 book ai didi

iOS 定时器在后台运行

转载 作者:可可西里 更新时间:2023-11-01 05:12:54 25 4
gpt4 key购买 nike

我的应用程序需要定期调用一个方法。

即使应用程序已置于后台,也应执行此调用。

应用程序处于后台的时间是不确定的,任何时候应用程序都可以从后台恢复。

我有一个类来管理计时器:

@protocol TimerDelegate <NSObject>
- (void)startTimerAction:(id)userInfo;
@end

@interface TimerController : NSObject{
NSTimer *repeatingTimer;
id <TimerDelegate> delegate;
}
+ (TimerController *)sharedInstance;

- (void)startTimerForSender:(id <TimerDelegate>)sender withTimeInterval:(NSTimeInterval)time;
- (void)stopTimer;

@end

实现:

#import "TimerController.h"

TimerController *singletonInstance;

@implementation TimerController

#pragma mark - Singleton
+ (TimerController *)sharedInstance {

if (singletonInstance == nil) {
singletonInstance = [[super allocWithZone:NULL] init];
}
return singletonInstance;
}

+ (id)allocWithZone:(NSZone *)zone
{
return [self sharedInstance];
}

- (id)copyWithZone:(NSZone *)zone
{
return self;
}

#pragma mark - Public
- (void)startTimerForSender:(id <TimerDelegate>)sender withTimeInterval:(NSTimeInterval)time
{
if (repeatingTimer) {
[self stopTimer];
}

if (sender) {
delegate = sender;
}

if (time > 0.0) {
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(targetMethod:)
userInfo:[self userInfo] repeats:YES];
repeatingTimer = timer;
}
}

- (void)stopTimer
{
if (repeatingTimer) {
[repeatingTimer invalidate];
repeatingTimer = nil;
}
}

- (NSDictionary *)userInfo
{
return @{@"StartDate" : [NSDate date]};
}

- (void)targetMethod:(NSTimer*)theTimer
{
if (delegate && [delegate respondsToSelector:@selector(startTimerAction:)]) {
[delegate startTimerAction:[repeatingTimer userInfo]];
}
}


@end

我以这种方式使用 TimerController 类:

-(void)viewDidLoad{
[super viewDidLoad]
TimerController *timerC = [TimerController sharedInstance];
[timerC startTimerForSender:self withTimeInterval:30];

}

#pragma mark - TimerDelegate

- (void)startTimerAction:(id)userInfo
{
NSLog(@"Method called");
}

我可以每 30 秒读取一次 NSLog 条目。将应用程序置于后台会使计时器停止并且它不会每 30 秒写入一次日志,当应用程序恢复时计时器正常工作。

尽管应用程序在后台,但我需要每 30 秒调用一次方法。

我读了这个问题:Timer in background mode

我必须能够向 AppStore 提交申请。

谢谢

最佳答案

- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
[application 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, preferably in chunks.

[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}

来源:iPhone Programmig Guide

类似问题:https://stackoverflow.com/a/8613624/1827690

关于iOS 定时器在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20095836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com