Πώς να διακόψετε την ουρά λειτουργία το Swift

ψήφοι
0

Έχω ένα ζευγάρι των εργασιών για την εκτέλεση της συσκευής IoT από το iOS App. Έτσι, όλες οι πράξεις μου είναι OperationsQueue με αύξοντα επιχειρήσεις.

Εδώ θέλω να εκτελέσει μια λειτουργία σε ένα χρόνο και κάθε επιχείρηση θα πρέπει να περιμένει μέχρι να πάρω μια απάντηση από τη συσκευή IoT.

Εδώ IoT ανταπόκριση συσκευή θα χρειαστεί χρόνος για να στείλει πίσω. Πώς, λοιπόν, να περιμένουμε για την τρέχουσα λειτουργία σε λειτουργία αναμονής μέχρι να πάρω μια απάντηση από IoT.

Έτσι, δεν υπάρχει κάποιος τρόπος για να διακόψετε την τρέχουσα λειτουργία σε λειτουργία μέχρι να πάρει μια απάντηση από IoT και στη συνέχεια θα το επαναλάβει, έτσι ώστε η επόμενη λειτουργία στη λειτουργία αναμονής θα ξεκινήσει.

Προσπάθησα με τη λειτουργία Sleep, όμως, απαιτείται χρόνος, αλλά δεν μπορούμε να εγγυηθούμε για IoT απόκριση της συσκευής.

Οποιεσδήποτε προτάσεις θα το εκτιμούσα. Ευχαριστώ εκ των προτέρων.

Δημοσιεύθηκε 09/10/2019 στις 19:00
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
1

Θα μπορούσατε να χρησιμοποιήσετε μια DispatchQueueκαι καλέστε .suspend()όταν στέλνετε τη λειτουργία, και να έχουν τον κωδικό που παίρνει την κλήση απάντηση .resume(). Στη συνέχεια, όποτε θέλετε να περιμένετε για την απάντηση πριν να συνεχίσετε, απλά βάλτε μια εικονική queue.sync({ print("done waiting")})και θα περιμένουν αυτόματα μέχρι να .resume()έχει κληθεί πριν από την εκτύπωση και τη συνέχιση.

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
Απαντήθηκε 10/10/2019 στις 22:49
πηγή χρήστη

ψήφοι
1

Η βασική ιδέα είναι ότι δεν μπορείτε να κάνετε παύση (ή περιμένετε, ή τον ύπνο), αλλά μάλλον να ορίσετε μια «παράλληλη» λειτουργία (βλέπε συζήτηση των ταυτόχρονων εργασιών στην τεκμηρίωση ), η οποία δεν συνεπάγεται την isFinishedκνθ μέχρι να ανταποκρίνεται η συσκευή.

Ένας απλός τρόπος για να γίνει αυτό είναι να γράψει μια παράλληλη τάξη λειτουργίας, όπως και το ένα φαίνεται σε αυτό απάντηση . Στη συνέχεια, το λειτουργικό σας IoT μπορεί υποκατηγορία αυτή την AsynchronousOperationκατηγορία, και απλά τηλεφωνήστε finish()όταν η συσκευή ανταποκρίνεται.

Στη συνέχεια, ουρά λειτουργία σας (η οποία προφανώς έχει maxConcurrentOperationCountτου 1, ή ίσως χρησιμοποιεί εξαρτήσεις), δεν θα ξεκινήσει την λειτουργία μέχρι να ολοκληρωθεί η προηγούμενη λειτουργία.

Απαντήθηκε 09/10/2019 στις 19:40
πηγή χρήστη

ψήφοι
0

Όπως Rob είπε, μπορείτε να εφαρμόσετε Ασύγχρονης τάξη Λειτουργία και υποκατηγορία από αυτό το IoT λειτουργία. Για μένα μοιάζει με το πιο προτιμώμενος τρόπος για την υλοποίηση περίπτωση yr.

Ως εναλλακτική λύση , σε περιπτώσεις όπου θα πρέπει να συνεχίσετε τη διαδικασία μόνο μετά από κάποια ασύγχρονη περίπτωση σε άλλο νήμα ολοκληρωθεί, μπορείτε να χρησιμοποιήσετε NSCondition . Αυτό είναι ένας μηχανισμός από obj-γ που παρέχει έναν εύκολο τρόπο να περιμένετε για να συμβεί μια κατάσταση.

Εδώ είναι το παράδειγμα:


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()

Απαντήθηκε 09/10/2019 στις 21:33
πηγή χρήστη

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