DispatchQueue:无法在非主线程上使用asCopy = NO调用

时间:2018-10-15 02:22:48

标签: swift grand-central-dispatch swift4.2 dispatch-queue

我在主线程上将UIAlertController表示为:

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

我正在从任何UIViewController调用该方法:

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

我正确地获得了输出。

但是在控制台中,我收到以下消息:

  

[Assert]不能在非主线程上使用asCopy = NO调用。

我在这里做错了什么吗?还是可以忽略此消息?

修改

感谢@NicolasMiari:

添加以下代码不会显示任何消息:

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

以前在控制台中显示消息的原因是什么?

1 个答案:

答案 0 :(得分:24)

您应从主队列上的showAlertMessage调用所有代码:

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