1

いくつかの作業が含まれているディスパッチキューがあります。アプリケーションがバックグラウンドに移行したときに、時間がなくなるかキューが空になるまで、キューを実行し続けたいと思います。UIBackgroundTaskIdentifierをどのように設定しますか?

そのようにディスパッチブロックに入れる必要がありますか?

    dispatch_async(queue, ^{
        if (_bgTask == UIBackgroundTaskInvalid) {
            if ([UIDevice currentDevice].multitaskingSupported) {
                _bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
                    if (_bgTask != UIBackgroundTaskInvalid) {
                        [[UIApplication sharedApplication] endBackgroundTask:_bgTask];
                        _bgTask = UIBackgroundTaskInvalid;
                    }
                }];
            }
        }

...
...

        if (_bgTask != UIBackgroundTaskInvalid) {
                    [[UIApplication sharedApplication] endBackgroundTask:_bgTask];
                    _bgTask = UIBackgroundTaskInvalid;
                }

            });

上記で起こったことは、キューが実際にブロックを実行するまで、長時間実行タスクとして登録されないことだと思います。それで、実際にキューに入れられる前に実行されるように、コードの背景部分をブロックの外側に配置する必要がありますか?

4

2 に答える 2

3

なぜあなたがUIBackgroundTaskIDivarであると私が想定しているものを追跡しているのかわかりません。これを行う最も簡単な方法は次のとおりです。

UIBackgroundTaskIdentifier btid = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{...}];
dispatch_async(queue, ^{
    ... // Your code...
    [[UIApplication sharedApplication] endBackgroundTask:btid];
}
于 2011-09-25T08:48:25.323 に答える
1

作業項目を含むディスパッチキューがあり、バックグラウンドに移動した場合、キューは180秒間そのタスクの作業を続行します(iOS 7以降)。その後、すべてがOSによって自動的に一時停止されます。したがって、NSThreads、NSTimers、さらにはNSOperationQueuesはもうありません。すべてが一時停止されます。

そのため、実行しようとしていることを実現するために、アプリケーション層に追加しようとしているコードがわかりません。ビルド済みです。

于 2014-07-18T22:46:29.727 に答える