Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
抛出异步函数是否会使它在Swift中同步?_Swift_Perfect - Fatal编程技术网

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

抛出异步函数是否会使它在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..")

这是一个取自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. 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的实现。