抛出异步函数是否会使它在Swift中同步?
这是一个取自Perfect Swift PostgresSTORM库的代码示例抛出异步函数是否会使它在Swift中同步?,swift,perfect,Swift,Perfect,这是一个取自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..")
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.
1.
3
“2..”不太可能在“1..”之前打印。是“尝试”让它作为同步功能运行吗?这完全取决于postgrestorm对
保存的实现。我不熟悉它,所以我不能说它是否真的是异步的,但我可以为您提供两个虚拟实现,一个是异步的,另一个是具有类似签名的方法的同步的
异步:
func save(callback: @escaping (Int) -> Void) throws {
OperationQueue.main.addOperation {
callback(0)
}
}
func save(callback: (Int) -> Void) throws {
callback(0)
}
同步:
func save(callback: @escaping (Int) -> Void) throws {
OperationQueue.main.addOperation {
callback(0)
}
}
func save(callback: (Int) -> Void) throws {
callback(0)
}
(注意,为了简单起见,本例中不会抛出任何异常)
当您调用可能引发异常且对(a)同步执行方法没有影响的函数时,Swift编译器需要使用try
。实际上,try
只是为了确保当我们使用该方法时,我们很清楚它可能引发异常
我可能错了,但如果是SwiftORM实现的save
方法,那么回调总是同步调用的。这是一些艺术性的缩进。感谢您的精彩解释。我深入研究了代码,Postgrestorm框架使用了同步表单方法(就像您在注释中显示的一样)。它正在使用SwiftORM的实现。