2017-03-02 20 views
0

私は速くて大きなスレッド作業で過度に経験していないので、私は少しスキルを向上させようとしています。または指導。これは私が理解できない1つの概念です。クロージャを使用した非同期メソッドをリターンタイプの同期メソッドに適合

私は入力ストリームと出力ストリームを介して通信するクラスを持っています。アプリケーションは出力ストリームを介して送信し、入力ストリームから結果を読み取ります。今私はコールバックを介して非同期を送信するメソッドを作成しましたが、私は同期的に送信し、より高いレベルでスレッドを処理する機能が欲しいです。上記のすべてのことのように非同期をラップするための一般的な方法はあり

typealias CommunicationCallback = ((CommunicationResult) -> Void) 

func sendAsync(send message: String, closure: @escaping CommunicationCallback) { 
    DispatchQueue.global().async { [weak self] in 
      guard let strongSelf = self else { 
       return 
      } 
      let messagePair = MessagePair(SendReceiveResult(sent: message, received: nil), 
            closure) 

      strongSelf.writeQueue.enqueue(messagePair) 
      strongSelf.writeFromQueue() //Calls the CommunicationCallback closure after it has read result 
     } 

} 

func sendSyncronized(send message: String) -> CommunicationResult { 
    ??? 
} 

: 現在、私の通信方式は、次のようになりますか?私はこの完全に間違っていると考えています場合には 、どのようなIDが」いくつかのケースでは、単純で、いくつかの例があるので、代わりに

send("foo", closure: { result in 
    switch result { 
    case .a: 
     foo() 
    base .b: 
     bar() 
    } 
}) 

毎回行うの

let result = sendSyncronized("foo") 

を呼び出すことができるようにしたいです以前の結果を待つ間に、多くの順次書き込みを行う必要があります。 助けを歓迎します!

答えて

-1

多分、オプションの戻り値の型を使用できます。

typealias CommunicationCallback = ((CommunicationResult) -> Type?) 

非同期メソッドの戻り値なしと同期メソッドの値。にオプションのバインドが成功したかどうかを確認する場合は、を使用してください。そうでなければ、とにかく閉鎖から価値を得る必要があります。

関連する問題