使用闭包将异步方法调整为具有返回类型的同步方法

时间:2017-03-02 17:56:02

标签: ios swift multithreading asynchronous closures

我是新手,并且在任何主要的线程工作中都没有过多的经验,所以我试着提高我的技能,希望得到一点帮助或指导。这是我似乎无法弄清楚的一个概念。

我有一个通过输入和输出流进行通信的类,应用程序通过输出流发送,并从输入流中读取结果。现在我已经创建了通过回调发送异步的方法,但我希望能够同步发送,并在更高级别处理线程。 目前我的沟通方法看起来像这样:

.each

是否有一种通用方法来包装异步所有如上所述? 如果我认为这完全错了,在某些情况下我喜欢简单地能够打电话

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 {
    ???
}

而不是

let result = sendSyncronized("foo")

每次,因为在某些情况下我需要在等待前一个结果时执行许多顺序写入。 欢迎任何帮助!

1 个答案:

答案 0 :(得分:-1)

也许您可以使用可选的返回类型。

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

在异步方法中返回nil,在同步方法中返回值。使用如果让检查可选绑定是否成功。如果没有,你需要从闭包中获取值。