0

我有一个后台任务streamer在 30 分钟后停止,如下所示:

- (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");在同一秒内被多次调用。

请指教。

4

1 回答 1

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:...in手动删除计时器applicationWillEnterForeground:。)

于 2013-06-17T09:02:41.480 回答