我有一个后台任务,在30分钟后停止streamer
,如下所示:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while ([[NSDate date] timeIntervalSinceDate:[[NSUserDefaults standardUserDefaults]objectForKey:@"date"]]<30) {
NSLog(@"<30");
[NSThread sleepForTimeInterval:1];
}
NSLog(@"Stop");
[main stopStreaming];
});
}
但问题是当用户输入背景bgTask再次调用时,这意味着如果用户输入10次背景,他将有10个背景UIBackgroundTaskIdentifier
这导致流光播放严重,NSLog(@"<30");
在同一秒钟内被调用多次。
请建议。
答案 0 :(得分:1)
您必须跟踪已启动的后台任务,并确保在启动新任务时不执行先前任务的工作。您可以通过在应用代理中保留NSInteger
并在每次递增时轻松完成此操作。
但更简单的方法是:(代替您的dispatch_async
电话)
SEL methodSelector = @selector(doThisAfter30Seconds);
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:methodSelector object:nil];
[self performSelector:methodSelector withObject:nil afterDelay:30];
这将设置一个30秒的计时器,并确保以前的计时器不运行。然后只需实施- (void)doThisAfter30Seconds
即可做任何事情。
(您可能需要检查doThisAfter30Seconds
该任务是否仍在后台,或者在cancelPreviousPerformRequestsWithTarget:...
中使用applicationWillEnterForeground:
手动删除计时器。)