web-dev-qa-db-fra.com

DispatchQueue: Impossible d'appeler avec asCopy = NO sur un thread autre que principal

Je présente le UIAlertController sur le fil principal comme suit:

class HelperMethodClass: NSObject {

    class func showAlertMessage(message:String, viewController: UIViewController) {
        let alertMessage = UIAlertController(title: "", message: message, preferredStyle: .alert)

        let cancelAction = UIAlertAction(title: "Ok", style: .cancel)

        alertMessage.addAction(cancelAction)

        DispatchQueue.main.async {
            viewController.present(alertMessage, animated: true, completion: nil)
        }
    }
}

Et j'appelle la méthode depuis n'importe quel UIViewController comme:

HelperMethodClass.showAlertMessage(message: "Any Message", viewController: self)

Je reçois la sortie correctement.

Mais en console je reçois le message ci-dessous:

[Assert] Impossible d'appeler avec asCopy = NO sur un thread non principal.

Y a-t-il quelque chose que j'ai mal fait ici ou que je peux ignorer ce message?

Éditer

Merci à @NicolasMiari:

L'ajout de code ci-dessous ne montre aucun message:

DispatchQueue.main.async {
    HelperMethodClass.showAlertMessage(message: "Any Message", viewController: self)
}

Quelle peut être la raison pour laquelle il montrait auparavant le message dans la console?

16
Amit

Vous devriez appeler tout le code de showAlertMessage dans la file principale:

class func showAlertMessage(message:String, viewController: UIViewController) {
    DispatchQueue.main.async {
        let alertMessage = UIAlertController(title: "", message: message, preferredStyle: .alert)

        let cancelAction = UIAlertAction(title: "Ok", style: .cancel)

        alertMessage.addAction(cancelAction)

        viewController.present(alertMessage, animated: true, completion: nil)
    }
}
32
Ilya Kharabet