首先,定时器的创建比较常用的有两种
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
但timerWithTimeInterval在创建时需要手动加入runloop,
NSTimer *timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
// 加入RunLoop中
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
需要注意的是:UIScrollView在滑动时NSDefaultRunLoopMode,UITrackingRunLoopMode会被挂起,定时器就会暂停,如果不需要在滑动时定时器暂停,可以将mode设为NSRunLoopCommonModes
定时器的释放方法
[timer invalidate];
timer = nil;
在进入后台时若想计时器不停的处理:
1、在不更改系统时间的前提下,可监听进入后台和进入前台的消息,在进入后台时存下时间戳,停掉定时器,在进入前台时计算时间差。重新开启定时器
2、
步骤一
在info里面如下设置:
info -->添加 Required background modes -->设置 App plays audio or streams audio/video using AirPlay
2725608-d27856df9423ca93.png
步骤二
在AppDelegate.m里面调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/*定时器后台运行*/
NSError *setCategoryErr = nil;
NSError *activationErr = nil;
/*设置Audio Session的Category 一般会在激活之前设置好Category和mode。但是也可以在已激活的audio session中设置,不过会在发生route change之后才会发生改变*/
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryErr];
/*激活Audio Session*/
[[AVAudioSession sharedInstance] setActive: YES error: &activationErr];
}
/*
通过UIBackgroundTaskIdentifier可以实现有限时间内在后台运行程序
程序进入后台时调用applicationDidEnterBackground函数,
*/
- (void)applicationDidEnterBackground:(UIApplication *)application{
UIApplication* app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid)
{
bgTask = UIBackgroundTaskInvalid;
}
});
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
if (bgTask != UIBackgroundTaskInvalid)
{
bgTask = UIBackgroundTaskInvalid;
}
});
});
}
网友评论