Cómo hacer una pausa cola de operaciones en Swift

votos
0

Tengo un par de operaciones para realizar en el dispositivo IO de iOS. Así Todas mis operaciones están en OperationsQueue con operaciones en serie.

Aquí quiero realizar una operación a la vez y cada operación tiene que esperar hasta que llegue una respuesta del dispositivo IO.

Aquí respuesta del dispositivo IO se necesitará tiempo para enviar de vuelta. Entonces, ¿cómo esperar a que la actual operación en cola de operaciones hasta que consiga una respuesta de la IO.

Entonces, ¿hay alguna manera de hacer una pausa en la operación actual en ejecución hasta obtener una respuesta de la IO y luego se reanudará de manera que la siguiente operación en la cola de operaciones se iniciará.

Probé con la operación de desconexión pero requería tiempo, pero no podemos garantizar acerca de respuesta del dispositivo IO.

Cualquier sugerencia apreciarlo. Gracias de antemano.

Publicado el 09/10/2019 a las 19:00
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

Se puede usar un DispatchQueuey llamar .suspend()cuando se envía la operación, y tienen el código que recibe la llamada de respuesta .resume(). A continuación, dondequiera que desea esperar a la respuesta antes de continuar, sólo hay que poner un maniquí queue.sync({ print("done waiting")})y se esperará automáticamente hasta que .resume()se ha llamado antes de imprimir y continua.

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
Respondida el 10/10/2019 a las 22:49
fuente por usuario

votos
1

La idea básica es que no se detiene (o espera, o el sueño), sino que más bien se define una operación de “concurrente” (véase el análisis de las operaciones simultáneas en la documentación ) que no activa el isFinishedMVA hasta que el dispositivo responde.

Una forma sencilla de hacerlo es escribir una clase operación simultánea, como la que se muestra en esta respuesta . Luego de su operación IO puede subclase que AsynchronousOperationla clase, y sólo llame finish()cuando el dispositivo responde.

Luego, su cola de operaciones (que presumiblemente tiene una maxConcurrentOperationCountde 1, o tal vez es el uso de las dependencias), no se iniciará una operación hasta que la operación anterior ha terminado.

Respondida el 09/10/2019 a las 19:40
fuente por usuario

votos
0

Como Rob dijo, se puede implementar la clase y subclase operación asíncrona de él tendrán la IO operación. Para mí se parece a la forma más preferida para implementar caso yr.

Como alternativa , en los casos en que necesita para continuar el proceso sólo después de algún evento asíncrono en otro hilo completado, puede utilizar NSCondition . Este es un mecanismo de obj-c, que proporciona una manera fácil de esperar a que se produzca una condición.

Aquí es un ejemplo:


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

Respondida el 09/10/2019 a las 21:33
fuente por usuario

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