Soy relativamente nuevo en Swift y me pregunto si alguien podría ayudar con este problema.

Estoy tratando de hacer que la etiqueta de un botón cambie a una ruleta de carga durante una llamada de servicio y luego cambie al mensaje de respuesta de esa llamada poco después.

Recibo este error en mi registro:

CoreAnimation: warning, deleted thread with uncommitted CATransaction; set CA_DEBUG_TRANSACTIONS=1 in environment to log backtraces.

Gracias por la ayuda. He leído sobre estos errores de animación principales, pero no estoy seguro de qué estoy haciendo mal, ya que todo aquí se hace de forma asincrónica.

Aquí está el código corregido, gracias @Pierce:

        self.pastebinButton.isEnabled = false
        self.pastebinButton.title = ""
        self.pastebinProgressIndicator.startAnimation(nil)

        pastebinAPI.postPasteRequest(urlEscapedContent: urlEscapeText(txt: text)) { pasteResponse in

            DispatchQueue.main.async {
                self.pastebinProgressIndicator.stopAnimation(nil)
                if pasteResponse.isEmpty {
                    self.pastebinButton.title = "Error"
                } else {
                    self.pastebinButton.title = "Copied!"
                }
            }

            DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
                self.pastebinButton.title = "Pastebin"
                self.pastebinButton.isEnabled = true
            })
0
xandermonkey 14 ene. 2017 a las 20:12
¿Es pastebinProgressIndicator un UIProgressView?
 – 
Pierce
14 ene. 2017 a las 20:49
Gracias por la respuesta. Es un NSProgressIndicator
 – 
xandermonkey
14 ene. 2017 a las 20:54
Estoy desarrollando para mac OS
 – 
xandermonkey
14 ene. 2017 a las 20:54
¿Se llama al bloque de finalización de postPasteRequest() en el hilo principal?
 – 
shallowThought
14 ene. 2017 a las 21:02
Realizo esta solicitud usando: let task = URLSession.shared.dataTask(with: request) {... donde request es un URLRequest
 – 
xandermonkey
14 ene. 2017 a las 21:04

1 respuesta

La mejor respuesta

Entonces estás llamando al DispatchQueue.main.async incluso antes de que te hayas movido fuera del hilo principal. Esto es innecesario. Además, una vez que está trabajando en el hilo de fondo, está actualizando alguna interfaz de usuario (el título de su botón) sin volver al hilo principal. Nunca actualice la interfaz de usuario en un hilo en segundo plano.

if !text.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines).isEmpty {

    self.pastebinButton.title = ""
    self.pastebinProgressIndicator.startAnimation(nil)

    pastebinAPI.postPasteRequest(urlEscapedContent: urlEscapeText(txt: text)) { pasteResponse in

       // Clean up your DispatchQueue blocks
       DispatchQueue.main.async {
           self.pastebinProgressIndicator.stopAnimation(nil)
           if pasteResponse.isEmpty {
               self.pastebinButton.title = "Error"
           } else {
               self.pastebinButton.title = "Copied!"
           }
       }

       DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
           self.pastebinButton.title = "Pastebin"
           self.pastebinButton.isEnabled = true
       })

    }
} else {
    Utility.playFunkSound()
}
1
Pierce 14 ene. 2017 a las 21:56