抛出异步函数是否使其在 Swift 中同步?

Does throwing a asynchronous function make it synchronous in Swift?

这是从 Perfect Swift PostgresSTORM 库中获取的代码示例。

do{
      //Create a user object
      let obj = User()
      obj.name = "someUser"
      //Save it to db
      try obj.save({ id in 
        print(2..)
        obj.id = id as! Int
      })
      print("1..")
    }catch{
     print("Something went wrong.")

    }
    //Go to next page
    print("3..")

我希望看到打印日志 1.. 3.. 2..

但是,日志看起来像这样。 2.. 1.. 3..

“2..”在“1..”之前打印的可能性很小。是 "try" 作为同步函数进入 运行 吗?

这完全取决于 save 的 PostgresSTORM 实现。我不熟悉它,所以我不能说它是否实际上是异步的,但我可以为您提供两种虚拟实现,一种是异步的,一种是具有类似签名的方法的同步。

异步:

func save(callback: @escaping (Int) -> Void) throws {
    OperationQueue.main.addOperation {
        callback(0)
    }
}

同步:

func save(callback: (Int) -> Void) throws {
    callback(0)
}

(请注意,为了简单起见,在此示例中它不会抛出任何异常)。

try 是 Swift 编译器所必需的,当您调用一个可能引发异常并且对方法的 (a) 同步执行没有影响的函数时。事实上 try 只是为了确保当我们使用该方法时我们很清楚它可能会抛出异常。

我可能是错的,但如果 this 是 SwiftORM 对 save 方法的实现,那么回调总是被同步调用。