3

iOS アプリのフォアグラウンドを終了した後にタスクを完了するためのサポートを追加しようとしています。私がインターネットで見たすべてのチュートリアルは、アプリケーション デリゲートで次のようなものを書くことを示しています。

- (void)applicationDidEnterBackground:(UIApplication *)application {
    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
        UIApplication *application = [UIApplication sharedApplication];
        __block UIBackgroundTaskIdentifier background_task;
        background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
            [application endBackgroundTask: background_task];
            background_task = UIBackgroundTaskInvalid;
        }];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            //DO STUFF IN BACKGROUND HERE
            MyTask *task = [[MyTask alloc] initWithURL:@"http://google.com"];
            [task setDelegate:self];
            [task start];

            [application endBackgroundTask: background_task];
            background_task = UIBackgroundTaskInvalid;
        });
    }
}

タスクは開始できますが、開始後、次の行が処理され、アプリが強制終了されます。デリゲート呼び出しが原因でいつMyTask停止するかはわかりますが、デリゲートが呼び出された後にバックグラウンド タスクが無効に設定されるようにプログラムを変更するにはどうすればよいですか。移動しますか

[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;

デリゲート関数に、または何か他のことをする必要がありますか?

助けてくれてありがとう、Guvvy

4

2 に答える 2

6

への呼び出しごとに、すでにバックグラウンドスレッドにいますdispatch_async。そのメソッドはすぐに戻りますが、ブロックは引き続き実行されます。

問題は、startメソッドが別の非同期プロセスを実行しているため、メソッドがすぐに返され、[task start]意味のあることを実行できるようになる前にバックグラウンドタスクが強制終了されることです。

デリゲートで殺害のルートに行く場合は、デリゲートメソッドがそれに到達できるようbackground_taskに保存するivarも作成する必要があります。background_taskそれは少し重いようです。

あなたはすでにバックグラウンドスレッドにいる[task start]ので、同期するようにリファクタリングすることをお勧めします。そうすれば、次の行が処理されて強制終了される前に、すべての意味のある作業が実行さbackground_taskれます。これはすっきりしているようで、バックグラウンドタスクのすべてがdispatch_asyncに送信されるブロックにうまくラップされています。

于 2012-09-06T21:40:44.280 に答える