Wie pausieren Betrieb Warteschlange in Swift

stimmen
0

Ich habe ein paar Operationen auf dem IoT Gerät von iOS App auszuführen. So Alle meine Operationen sind in OperationsQueue mit seriellen Operationen.

Hier mag ich eine Operation zu einem Zeitpunkt durchzuführen und jede Operation muss warten, bis ich eine Antwort von dem IoT Gerät.

Hier IoT Geräteantwort wird einige Zeit dauern zurück zu senden. so wie für den laufenden Betrieb in Betrieb Warteschlange warten, bis ich eine Antwort von IoT bekommen.

So ist es eine Möglichkeit laufenden Betrieb zu unterbrechen, bis eine Antwort von IoT bekommen und dann werde ich es wieder aufnehmen, so dass die nächste Operation in Betrieb Warteschlange gestartet.

Ich habe versucht, mit Sleep-Funktion Aber es benötigt Zeit, aber wir können nicht garantieren, über das Internet der Dinge Geräteantwort.

Alle mögliche Vorschläge würden es zu schätzen wissen. Danke im Voraus.

Veröffentlicht am 09/10/2019 um 19:00
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
1

Sie könnten ein verwenden DispatchQueueund rufen Sie, .suspend()wenn Sie den Betrieb senden, und den Code haben, der die Antwort Anruf bekommt .resume(). Dann , wo Sie auf die Antwort warten soll , bevor Sie fortfahren, nur ein Dummy setzen queue.sync({ print("done waiting")})und es wird automatisch warten , bis .resume()hat vor dem Druck und Weiter genannt.

import Dispatch
var queue = DispatchQueue(label: "queue")

func sendOperationToIoTDevice(){
    //send the operation
    //...
    queue.suspend()
}

...

//whatever code gets the response:
    //get response
    //...
    queue.resume()

...

//main code

sendOperationToIoTDevice()
queue.sync { print("done waiting") } // will hang here until .resume() is called
Beantwortet am 10/10/2019 um 22:49
quelle vom benutzer

stimmen
1

Die Grundidee ist , dass Sie nicht unterbrechen (oder warten, oder Schlaf), sondern definieren Sie eine „gleichzeitige“ -Operation (Diskussion der gleichzeitigen Operationen sehen Sie in der Dokumentation ) , die nicht den auslöst isFinishedKVO bis das Gerät reagiert.

Ein einfacher Weg , dies zu tun , ist eine gleichzeitige Operation Klasse zu schreiben, wie die eines in dieser Antwort gezeigt . Dann können Sie Ihre IoT Operation , die eine Unterklasse der AsynchronousOperationKlasse, und rufen Sie einfach an , finish()wenn das Gerät reagiert.

Dann wird Ihr Betrieb Warteschlange (die vermutlich hat eine maxConcurrentOperationCountvon 1oder vielleicht Abhängigkeiten verwendet), wird eine Operation nicht starten , bis der vorherige Vorgang abgeschlossen ist.

Beantwortet am 09/10/2019 um 19:40
quelle vom benutzer

stimmen
0

Als Rob sagte, können Sie asynchronen Betrieb Klasse und Unterklasse von ihm Ihre implementieren IoT Betrieb. Für mich sieht es aus wie die am meisten bevorzugte Art und Weise yr Fall zu implementieren.

Als Alternative , in Fällen , in denen Sie den Prozess fortsetzen müssen erst nach einigem asynchronen Ereignis in einem anderen Thread abgeschlossen, können Sie NSCondition . Dies ist ein Mechanismus von obj-c , die eine einfache Möglichkeit, zu warten , bis eine Bedingung auftreten.

Hier ist Beispiel:


let cond = NSCondition()
var available = false
var SharedString = ""

class WriterThread : Thread {

    override func main(){
        for _ in 0..<5 {
            cond.lock()
            SharedString = "😅"
            available = true
            cond.signal() // Notify and wake up the waiting thread/s
            cond.unlock()
        }
    }
}

class PrinterThread : Thread {

    override func main(){
        for _ in 0..<5 { //Just do it 5 times
            cond.lock()
            while(!available){   //Protect from spurious signals
                cond.wait()
            }
            print(SharedString)
            SharedString = ""
            available = false
            cond.unlock()
        }
    }
}

let writet = WriterThread()
let printt = PrinterThread()
printt.start()
writet.start()

Beantwortet am 09/10/2019 um 21:33
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more