0

这是取自 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..”之前打印。是让它作为同步函数运行的“尝试”吗?

4

1 回答 1

1

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

异步:

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

同步:

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

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

trySwift 编译器在调用可能引发异常并且对方法的(a)同步执行没有影响的函数时需要它。实际上try只需要确保当我们使用该方法时,我们很清楚它可能会引发异常。

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

于 2017-05-17T06:37:36.170 回答