Quindi ho un'applicazione che attiva una serie di eventi asincroni e quindi scrive i risultati in un buffer. Il problema è che voglio il buffer da scrivere sincrono (nel thread che ha generato il processo asincrono)Swift 2 - iOS - Ritorno al thread di origine
codice scheletro è come tale
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
}
}
il problema è il filo che chiama è dataTaskWithRequest
è in thread, say, 3. Il gestore di completamento si attiva in molti thread diversi e causa case NSStreamEvent.HasSpaceAvailable:
nell'esecuzione nel thread 3, oltre a tutti i thread in cui erano presenti.
La mia domanda è: come faccio a fare in modo che self.stream(self.output, handleEvent: NSStreamEvent.hasSpaceAvailable)
sia chiamato nel thread 3, o quale sia il thread originale w per evitare che si inciampino l'un l'altro nella fase di uscita.
Grazie in anticipo!
NOTA: Il filo che contiene la gestione di input/output è stato creato con NSThread.detachNewThreadSelector
Come creare le proprie code e passare quella che dovrebbe essere utilizzata per lo scrittore? (Dico "coda" perché hai taggato con gcd.) –
Ho pensato di farlo circa 5 minuti prima che dovessi lasciare il lavoro. Crea il thread/coda e canalizza tutto il risultato. In questo modo, anche se ci sono più thread che chiamano, non tutti cercano di eseguire contemporaneamente. Sono fuori fino a martedì ora, quindi se questa è la strada che andrò ti farò sapere come va – Ajwhiteway
Ho già un NSThread creato da NSThread.detachNewThreadSelector. Questo è il thread di cui ho bisogno per richiamare. Temo che l'invio possa effettivamente peggiorare il problema (i flussi si chiudono prima che tutto sia finito) – Ajwhiteway