iOS异步功能不按顺序

标签 ios swift asynchronous

我是 swift 异步方面的新手,我正在尝试实现对函数的简单异步调用。

import UIKit

func doAsyncStuff ( completionHandler: (_ result: Double) -> Void) {
    print("start async")
    sleep(5)   // to simulate long work
    let result: Double = 123.456
    completionHandler(result)
}

print("A")

doAsyncStuff() { result in
    print(result)
}

print("B")

当我执行它时,我得到

A
start async
123.456
B

由于函数是异步调用的,所以我希望得到

A
start async
B
123.456

我哪里错了? 非常感谢

最佳答案

问题是您正在调用 sleep,这是一个同步阻塞函数,因此您阻塞了主线程 5 秒,同时无法执行任何其他操作。您应该使用 DispatchQueue.asyncAfter 来测试简单的异步调用。

您还可以知道您的函数不是异步的,因为您没有收到编译器错误,因为您没有将闭包标记为 @escaping,您需要为异步完成处理程序执行此操作。

func doAsyncStuff(completionHandler: @escaping (_ result: Double) -> Void) {
    print("start async")
    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
        completionHandler(123.456)
    }
}

关于iOS异步功能不按顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54364384/

相关文章:

jquery - JS/溢出 :hidden performance issues in Safari on iPad/iOS

ios - 收到代码签名错误。它在我的本地机器上显示 "Provisioning profile could not be found"

ios - 如何在 iOS 中分配提醒 (EKReminder)?

ios - 快速从对象数组检索数据时出错

ios - Swift3 GCD 中的 main.async vs main.sync() vs global().async

c++ - 使用 Redis 从 C++ 触发 Celery 任务

ios - xcode 4 仅在设备上复制一次资源

ios - Clocationmanager Didupdatelocation 委托(delegate)在没有互联网的情况下不会被调用

ios - 我如何消除 setter 对 View 的副作用?

javascript - 异步 JavaScript 不允许我的函数返回?