2017-05-17 12 views
0

これは、Perfect Swift PostgresSTORMライブラリから取得したコード例です。非同期関数をスローすると、Swiftで同期されますか?

私は 1 .. 3であることを印刷ログを参照することが期待
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..") 

.. 2 ..

しかし、ログはこのように見えました。 2 .. 1 .. 3 ..

"2 .."が "1 .."の前に印刷することはほとんどありません。同期機能として動作させる「試行」ですか?

+1

これはいくつかの芸術的なインデントです。 – Alexander

答えて

1

PostgresSTORMの実装は、saveまでです。私はそれに精通していないので、それは実際に非同期かどうかは言えませんが、私はあなたに2つのダミーの実装を提供することができます、1つは非同期であり、

非同期:

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

同期:

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

(それだけで簡単のため、この例では任意の例外をスローしないことに注意してください)。

tryは、例外をスローし、(a)メソッドの同期実行に影響を与えない関数を呼び出すときにSwiftコンパイラが必要です。実際にはtryは、このメソッドを使用するときに例外をスローする可能性があることを十分に認識するために必要です。

私は間違っているかもしれませんが、thisがSwiftORMのsaveメソッドの実装である場合、コールバックは常に同期的に呼び出されます。

+0

大きな説明をありがとう。私はコードを掘り出し、Postgrestormフレームワークは同期フォームをメソッドを使用します(一度コメントに表示したのと同じです)。 SwiftORMの実装を使用しています。 – rajeeva9

関連する問題