1

サーバーに送信する位置更新の長時間実行タスクを実装しています。NSTimer を使用して、60 秒ごとにメソッドを呼び出しています。次のコードを使用している多くの投稿を読みました。

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            self.timerLocationUpdateToServer = [NSTimer timerWithTimeInterval:interval
                                                                       target:self
                                                                     selector:@selector(retryLocationUpdateToServer)
                                                                     userInfo:nil
                                                                      repeats:YES];

            dispatch_async(dispatch_get_main_queue(), ^{
                [[NSRunLoop mainRunLoop] addTimer:self.timerLocationUpdateToServer forMode:NSDefaultRunLoopMode];

            });
        });

本当に dispatch_async を使用する必要がありますか? はいの場合、なぜですか?

1 つはタイマー用、もう 1 つはタスク用の 2 つの識別子を使用するものもありました。

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;

    }];

    bgTask1 = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask1];
        bgTask1 = UIBackgroundTaskInvalid;

    }];

2 つの UIBackgroundTaksIndentifier を初期化する必要がありますか、それとも 1 つが目的を解決しますか?

ありがとう

4

1 に答える 1

1

dispatch_async()バックグラウンドキューへのあなたのことはまったく無意味です。無意味であるだけでなく、安全ではない可能性があります (timerLocationUpdateToServerプロパティにアクセスする他のコードと、それがアトミックかどうかによって異なります)。最初のコードブロック全体を次のように置き換える必要があります

self.timerLocationUpdateToServer = [NSTimer scheduledTimerWithTimeInterval:interval
                                                                    target:self
                                                                  selector:selector(retryLocationUpdateToServer)
                                                                  userInfo:nil
                                                                   repeats:YES];

同様に、2 番目のコード ブロックでは、必要なバックグラウンド タスク識別子は 1 つだけです。複数でも機能しますが、管理できる場合は 1 つだけを使用する方が実際には効率的です (バックグラウンド タスクの開始は無料ではないため)。

于 2013-01-31T07:56:11.890 に答える