Objective-C后台任务UIBackgroundTaskIdentifier重复

时间:2013-06-17 08:32:50

标签: ios objective-c background-process uiapplication dispatch-async

我有一个后台任务,在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");在同一秒钟内被调用多次。

请建议。

1 个答案:

答案 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:手动删除计时器。)