2017-03-02 44 views
0

我是新來的swift,並且在任何主要線程工作中都沒有過多的經驗,所以我嘗試提高我的技能,希望得到一些幫助或指導。這是我無法想象的一個概念。使用閉包將同步方法修改爲具有返回類型的同步方法

我有一個類,它通過輸入和輸出流進行通信,應用程序通過輸出流發送,並從輸入流中讀取結果。現在我已經創建了通過回調發送異步的方法,但我希望能夠同步發送,並在更高級別處理線程。 目前我的通信方法看起來是這樣的:

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」就像在某些情況下,簡單地可以稱之爲

let result = sendSyncronized("foo") 

而不是做

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

每次,因爲有一些案件中,在等待以前的結果時,我需要做很多順序寫入操作。 歡迎任何幫助!

回答

-1

也許你可以使用可選的返回類型。

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

返回異步方法中的nil和同步方法中的值。如果讓檢查可選綁定是否成功,則使用。如果不是,那麼無論如何您都需要從關閉中獲取值。