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です。

(タスクがまだバックグラウンドにあることを確認するか、 inを使用しdoThisAfter30Secondsてタイマーを手動で削除することをお勧めcancelPreviousPerformRequestsWithTarget:...applicationWillEnterForeground:ます。)

于 2013-06-17T09:02:41.480 に答える