3

Action Extension を使用して写真アプリから画像をアップロードしようとしています。NSURLSession を使用してバックグラウンドでアップロードします。これが私が使用するコードです。

var configName = "com.myapp.uploadImage"
var config  = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(configName)
config.sharedContainerIdentifier = "group.myApp.sample"

var session = NSURLSession(configuration: config)
let task = session.dataTaskWithRequest(request)
task.resume()

self.extensionContext!.completeRequestReturningItems(self.extensionContext!.inputItems, completionHandler: nil)

それは正常に動作します。

問題は、画像をアップロードしてビューを一度閉じてから、最初のプロセスがまだバックグラウンドで実行されている間に 2 番目の画像をアップロードしようとすると、最初の NSURLSession が完了しないことです。2 番目のプロセスのみが完了します。つまり、2 番目のセッションは 1 番目のセッションを克服します。

NSOperationQueue を使ってみました。ただし、アクション拡張機能をいったん閉じてから 2 番目のセッションで再度開くと、新しい NSOperationQueue が作成されるだけなので、問題は解決しません。

どんな提案も役に立ちます。前もって感謝します。

4

1 に答える 1

2

最初のセッションがまだ実行されている間に、同じ識別子で 2 番目のバックグラウンド セッションをインスタンス化しようとしないでください。バックグラウンド セッションを保存して、後で使用できるようにします。

URL Loading System Programming Guide: Using NSURLSessionの「バックグラウンド セッションに関する考慮事項」には、次のように書かれています。

注: 識別子 (構成オブジェクトの作成時に指定) ごとに 1 つのセッションを作成する必要があります。同じ識別子を共有する複数のセッションの動作は未定義です。

このドキュメントでは、デリゲートを指定して実装する必要があることにも言及しています。アプリ拡張プログラミング ガイドの「アップロードとダウンロードの実行」セクションで提供されている例では、デリゲートも指定されています。

また、メイン アプリのアプリ デリゲートはhandleEventsForBackgroundURLSessionメソッドを実装していますか? メソッドが呼び出されcompletionHandlerたときに、をキャプチャして呼び出す必要があります。NSURLSessionDelegateURLSessionDidFinishEventsForBackgroundURLSession

最後に、data タスクを使用していることに気付きました。ドキュメントは、NSURLSessionバックグラウンド セッションでデータ タスクを使用するべきではなく、アップロード/ダウンロード タスクのみを使用すべきであると具体的に述べています。デリゲート メソッドを使用しないようにするためだといつも思っていましたがdidReceiveData、バックグラウンド セッションでのデータ タスクに関連する他の問題が発生した場合に備えて、アップロード タスクを使用してみるかもしれません。

于 2014-12-05T13:15:57.003 に答える