使用DispatchQueue结果

时间:2018-01-25 22:04:43

标签: swift

以上代码检查以确保电子邮件地址有效,此部分正常运行。我还可以从完成处理程序中正确检索值。

DispatchQueue.global(qos: .utility).async {
    let json = Json() 
    //check is email address exists using completion handler

    json.isEmailAddressValid(input:email!) { (result: Bool) in
    print("Result", result)

    DispatchQueue.main.async {         
        if (!(result)) {
            print("Email not found")
            message?.append("\nEmail Address does not exisit")
        }
    }
}

self.alert(message:message!)

我想在找不到电子邮件地址时使用结果变量,然后将未找到电子邮件地址的消息附加到连接的字符串上。我已尝试多次,但在使用DispatchQueue时,错误消息永远不会显示在警报视图中。我使用的是错误的帖子吗?

2 个答案:

答案 0 :(得分:0)

问题是您正在调用异步方法,但在继续执行代码之前不等待结果。

在从self.alert(message:message!)执行闭包之前执行对json.isEmailAddressValid(input:email!) { (result: Bool) in的调用。

要解决此问题,只需将警报移至DispatchQueue.main.async代码块中,如下所示:

                DispatchQueue.main.async {

                    if (!(result)) {
                        print("Email not found")
                        message?.append("\nEmail Address does not exisit")

                    }
                    self.alert(message:message!)
                }

作为一个单独的问题,您可能不需要在DispatchQueue.global(qos: .utility).async {块中包含所有这些内容。

答案 1 :(得分:0)

需要在DispatchQueue.main.async闭包内调用self.alert(message:message!)。

当您使用async方法调用DispatchQueue时,将运行异步调用之后的代码,然后调用异步闭包内的代码。 (这是对发生的事情的简化......)

例如:

print("A")
DispatchQueue.main.async {
    print("C")
}
print("B")

此代码将打印:

A 
B
C

在您的示例中发生同样的事情,首先显示警报,然后处理isEmailAddressValid的结果,然后处理DispatchQueue.main.async中的代码。

Google“Grand Central Dispatch”或“GCD”,了解有关使用DispatchQueues的更多信息