2016-11-30 23 views
1

NSURLSessionTaskを作成して再開した後にNSURLSession操作キューが空であるのはなぜですか?NSURLSessionのすべてのタスクが完了するのを待つ方法

NSURLSessionにタスクが保留中であるかどうかを確認する手段はありますか?

目標が完了するまでに複数のタスクを待つことであるが、これは動作しません:

NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithStreamedRequest:request]; 
[uploadTask resume]; 
// this prints "0" 
NSLog(self.session.delegateQueue.operationCount) 
// this returns immediately instead of waiting for task to complete 
[self.session.delegateQueue waitUntilAllOperationsAreFinished]; 
+0

OK、私は 'NSURLSession事実に関するhttps://github.com/AFNetworking/AFNetworking/issues/1504とhttps://stackoverflow.com/q/19414486/1033581で手がかりを見つけたかもしれません'をバッチ処理に単独で使用することはできません。 –

+1

DispatchGroupはあなたが必要なものです:) Googleの結果でこのリンクが見つかりましたhttp://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/ –

答えて

3

私は、提案されたDispatchGroupを使用してセッションを無効にすることを避ける解決策を見出しました。

uploadTaskWithStreamedRequest:を使用しているとき、私たちはURLSessionTaskDelegatefunc urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)を実装する必要があること

注意(質問がにObjCにあるとき答えは、スウィフトにある...しかし、それは同じロジックです)。したがって、答えを簡略化するために、DispatchGroupの使用方法をuploadTaskWithRequest:from:completionHandler:とデモンストレーションします。

// strong reference to the dispatch group 
let dispatchGroup = DispatchGroup() 

func performManyThings() { 
    for _ in 1...3 { 
     let request = URLRequest(url: URL(string: "http://example.com")!) 
     dispatchGroup.enter() 
     let uploadTask = self.session.uploadTask(with: request, from: nil) { [weak self] _, _, _ in 
      self?.dispatchGroup.leave() 
     } 
     uploadTask.resume() 
    } 
    dispatchGroup.notify(queue: .main) { 
     // here, all the tasks are completed 
    } 
} 
1

それは限り、あなたは、セッションを再利用する気にしないとやって気にしないように非常に簡単です非同期的に:

  • セッションではfinishTasksAndInvalidateに電話してください。
  • セッション代理人にURLSession:didBecomeInvalidWithError:メソッドを実装すると、最後のタスクの終了後に必要な作業がすべて実行されます。

つまり、上のコードの問題は、コードが実行ループをブロックしている間は起こり得ない最初のフェッチを開始するまで、セッションには何の操作もないということです。一般的には、NSURLSessionを同期して使用しないでください。物事を解決することは、ほとんど常に間違った方法です。 :-)

+0

私はあなたの答えをアップアップしました。なぜなら、私はセッションを再利用することを指定しなかったからです。真実は、私はそれを再利用する必要があったので、私は別の答えを受け入れました。 –

関連する問題