У меня есть приложение, которое запускает ряд асинхронных событий, а затем записывает результаты в буфер. Проблема заключается в том, что я хочу, чтобы буфер записывается синхронно (в потоке, который порождал асинхронный процесс)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
в thread, скажем, 3. Обработчик завершения срабатывает во многих разных потоках и вызывает работу case NSStreamEvent.HasSpaceAvailable:
в потоке 3, а также все потоки, в которых они существуют.
Мой вопрос: Как сделать так, чтобы self.stream(self.output, handleEvent: NSStreamEvent.hasSpaceAvailable)
был вызывается в потоке 3 или какой-либо исходный поток w чтобы предотвратить это отключение друг от друга в выходной фазе.
Заранее благодарен!
Примечание: Поток, который содержит обработку ввода/вывод был создан с NSThread.detachNewThreadSelector
Как насчет создания собственной очереди (ов) и передачи той, которая должна использоваться вашим автором? (Я говорю «очередь», потому что вы отметили gcd.) –
Я думал об этом примерно за 5 минут до того, как мне пришлось покинуть работу. Создайте поток/очередь и переместите весь вывод на это. Таким образом, даже если есть несколько потоков, вызывающих, они не все пытаются выполнить сразу. Я уезжаю до вторника сейчас, так что если это маршрут, я пойду, я дам вам знать, как это происходит. – Ajwhiteway
У меня уже есть NSThread, созданный NSThread.detachNewThreadSelector. Это поток, который мне нужно перезвонить. Я боюсь, что диспетчеризация может на самом деле ухудшить проблему (закрытие потоков до того, как все будет завершено) – Ajwhiteway