2

NSURLConnection画像のアップロードに非同期を使用しています。マイナーな要件があり、それを達成するための効率的な方法を知りたいです。アップロードボタンを押すと、現在のView Controllerがポップされるので、必要なのは、ナビゲーションコントローラースタックのどの部分にいても、アップロード操作がバックグラウンドで続行されることです。ナビゲートしてどこにでもいることができますが、それでもそのアップロードをバックグラウンドで実行したいと思います。

それを達成するための効率的でエレガントな方法についてのヒントが必要です。

4

2 に答える 2

3

この場合、「バックグラウンドで」とは、別のスレッドでの意味です。したがって、あなたはマルチスレッドについて話しているのです。iOSの場合のバックグラウンド処理(アプリケーションがバックグラウンドにあるときに実行されるタスク)と混同しないでください。

あなたがやりたいことをするために、私はGCD(Grand Central Dispatch)を使うことをお勧めします、あなたはスムーズdispatchblock「バックグラウンドのような」処理を達成するために別のスレッド(メインスレッド以外)にコードを送ることができます-覚えておいてくださいメインスレッドはUIに関連するすべてを処理するため、(文字通り)ブロックしないようにするには、別のスレッドのリモートソースとの間でのダウンロード/アップロードなどの長期的なプロセスを実行する必要があります。

これはあなたがそうすることができることの例です:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Prepare your upload request

    NSError * _urlError = nil;
    NSHTTPURLResponse * _responseHeaders = nil;
    NSData * responseData = [NSURLConnection sendSynchronousRequest:uploadHTTPRequest 
                                                  returningResponse:&_responseHeaders 
                                                              error:&_urlError];

    // by this line, we have a response
    dispatch_async( dispatch_get_main_queue(), ^{
        // Update UI or whatever, this is where you "rejoin" the main thread if needed.
        // Maybe for development, show a UIAlertView...
    });

});
于 2012-08-06T03:32:42.620 に答える
1

アップロードロジックを、それをトリガーするViewControllerから分離する必要があります。

おそらく、キュー内のさまざまなView Controllerからのすべてのアップロードを処理し、進行状況やエラーなどについて(通知などを介して)関心のあるViewControllerに通知する「アップロードマネージャー」クラスを作成できます。

また、ホームボタンを押すことで、アプリがバックグラウンドに送信されたときにアップロードを続行するためのバックグラウンドタスク識別子を管理することもできます。

于 2012-08-06T03:41:55.010 に答える