でネットワークコールを行う複数のNSOperation
を連鎖して、すべて完了するまで待つ必要があります。NSOperationQueue内のNSOperationの非同期コールバックが呼び出されることはありません
NSOperation
をすべてNSOperationQueue
に追加してから、operationQueue.waitUntilAllOperationsAreFinished()
に電話してください。これは動作しますが、操作の状態を「完了」に設定したコールバックは、NSOperations
のコールバックとして無期限に待機し、決して呼び出されません。
私は、次のNSOperation
サブクラスを使用しています:
class ConcurrentOperation: NSOperation
{
enum State: String
{
case Ready, Executing, Finished
private var keyPath: String
{
return "is" + self.rawValue
}
}
var state: State = State.Ready {
willSet (newValue)
{
self.willChangeValueForKey(newValue.keyPath)
self.willChangeValueForKey(self.state.keyPath)
}
didSet
{
self.didChangeValueForKey(oldValue.keyPath)
self.didChangeValueForKey(self.state.keyPath)
}
}
}
extension ConcurrentOperation
{
override var ready: Bool {
return super.ready && self.state == .Ready
}
override var executing: Bool {
return self.state == .Executing
}
override var finished: Bool {
return self.state == .Finished
}
override var concurrent: Bool {
return true
}
override var asynchronous: Bool {
return true
}
}
extension ConcurrentOperation
{
override func start()
{
if self.cancelled
{
self.state = .Finished
return
}
self.state = .Executing
self.main()
}
override func cancel()
{
self.state = .Finished
}
}
これはRaywenderlichチュートリアルとhttps://gist.github.com/calebd/93fa347397cec5f88233に基づいています。
ConcurrentOperation
サブクラスのmain()
メソッドが.Finished
に状態を設定した場合にのみ、それが完了したことをNSOperationQueueに伝えます。 これは操作によっても実現されます。
しかし、私は、このようなConcurrentOperation
サブクラスでは、次のmain()
の方法を構築した場合非同期部分が呼び出されることはありませんよう、NSOperationQueue
が停止することはありません:
override func main()
{
dispatch_async(dispatch_get_main_queue(), {
sleep(1)
self.state = .Finished // never called!
})
}
問題は同じですFirebase-Query私のアプリで使用するコールバック。
concurrent: Bool
プロパティを無効にして、true
を返そうとしましたが、それでもどちらも修正されません。
非同期タスクは、実際に私のConcurrentOperation
サブクラスの 'main()
メソッドで実行されますか?
ありがとうございました!
メインキューで 'waitUntilAllOperationsAreFinished'を呼び出していますか?その場合、メインキューをブロックし、 'dispatch_async(dispatch_get_main_queue()...')コードでは – Paulw11
を実行する機会がありません。私が 'dispatch_async(_、_) 'ブロック、それはメインキューをブロックしました。あなたは素晴らしいです!ありがとう!私の質問に定期的な答えを書くなら、私はそれを正しいとマークします。 – florianpfisterer