私は、一連の非同期イベントを起動し、その結果をバッファに書き込むアプリケーションを持っています。問題は、私は同期(非同期プロセスをスポーンスレッドで)Swift 2 - iOS - 元のスレッドにディスパッチ
スケルトンコードに書き込まれるバッファは、
let Session = NSURLSession.sharedSession()
let TheStack = [Structure]()
//This gets called asynchronously, e.g. in threads 3,4,5,6,7
func AddToStack(The Response) -> Void {
TheStack.insertAt(Structure(The Response), atIndex: 0))
if output.hasSpaceAvailable == true {
// This causes the stream event to be fired on mutliple threads
// This is what I want to call back into the original thread, e.g. in thread 2
self.stream(self.output, handleEvent: NSStreamEvent.hasSpaceAvailable)
}
}
// This is in the main loop, e.g. thread 2
func stream(aStream: NSStream, handleEvent: NSStreamEvent) {
switch(NSStreamEvent) {
case NSStreamEvent.OpenCompleted:
// Do some open stuff
case NSStreamEvent.HasBytesAvailable:
Session.dataTaskWithRequest(requestFromInput, completionHandler: AddToStack)
case NSStreamEvent.HasSpaceAvailable:
// Do stuff with the output
case NSStreamEvent.CloseCompleted:
// Close the stuff
}
}
として問題が呼び出すスレッドであるたいことであるがdataTaskWithRequest
になっています完了ハンドラは多くの異なるスレッドで起動し、スレッド3とスレッドが存在するすべてのスレッドで、case NSStreamEvent.HasSpaceAvailable:
が実行されます。
私の質問は:self.stream(self.output, handleEvent: NSStreamEvent.hasSpaceAvailable)
がスレッド3で呼び出された、またはそれまでの何らかの元のスレッドwこの出力フェーズでの相互のトリップを防止する。
ありがとうございます!
注:入力/出力処理が含まれているスレッドが、私はコメントから、私が何を私もともと行う方法を考え出した質問への助けを借りて、好奇心旺盛な傍観者のために、NSThread.detachNewThreadSelector
独自のキューを作成し、使用する必要があるキューをライターに渡すのはどうですか? (あなたはgcdでタグ付けされているので私は「キュー」と言っています) –
私は仕事を辞さなければならない約5分前にそれについて考えました。スレッド/キューを作成し、すべての出力をそれに集めます。そのようにしても、複数のスレッドが呼び出されていても、すべてを一度に実行しようとするわけではありません。私は火曜日までになっているので、もしそれが私が行くルートなら、あなたはそれがどうなるかを知らせます – Ajwhiteway
私は既にNSThread.detachNewThreadSelectorによって作成されたNSThreadを持っています。これは私がコールバックする必要があるスレッドです。実際にはディスパッチが問題を悪化させる恐れがあります(ストリームがすべて終了する前に終了します)。 – Ajwhiteway