2

ユーザーがアプリをバックグラウンドに移動したときに、シリアルディスパッチキューを使用して一部のネットワークリクエストをシリアル化します。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    dispatch_queue_t opQ = dispatch_queue_create("com.myapp.network", NULL);
    dispatch_async(opQ, ^{
        [self sendNetworkData1];
        [self sendNetworkData2];
        [self sendNetworkData3];
    });
}

問題は、私が作成したこのキューで実行すると、想定されている5秒間でもアプリがアクティブのままにならないことです。

逆に、同じリクエストをキューの外に送信すると、約8秒間送信されます。しかし、アプリはその後クラッシュします。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
        [self sendNetworkData1];
        [self sendNetworkData2];
        [self sendNetworkData3];
}

また、残りの1つをディスクに書き込んで、ユーザーが次にアプリを開いたときに送信できるようにします。

これを実装するための最良の方法は何ですか?

4

1 に答える 1

2

アプリケーションがバックグラウンドに入るときに、タスクを完了するために追加の時間が必要な場合は、OSにそのことを通知する必要があります。詳細なドキュメントは次のとおりです:http ://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html 。これが簡単で汚いパッチです。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
     __block UIBackgroundTaskIdentifier backgroundTask; //Create a task object

    backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^ {
        [application endBackgroundTask:background_task]; 
        backgroundTask = UIBackgroundTaskInvalid; //Set the task to be invalid
     }];

    dispatch_queue_t opQ = dispatch_queue_create("com.myapp.network", NULL);
    dispatch_async(opQ, ^{
        [self sendNetworkData1];
        [self sendNetworkData2];
        [self sendNetworkData3];
        [application endBackgroundTask:background_task]; 
        backgroundTask = UIBackgroundTaskInvalid; //Set the task to be invalid
    });
}

つまり、beginBackgroundTaskWithExpirationHandlerを使用して、アプリケーションをバックグラウンドで実行する必要があることを通知します。完了したら、endBackgroundTask:を呼び出して、バックグラウンドでの処理が終了したことをOSに通知します。最後に、backgroundTask変数をUIBackgroundTaskInvalidにリセットしてください。

于 2012-08-27T20:10:43.383 に答える