迅速派遣总队

问题描述

我有重复的代码。我想更新主线程上的内容,UI内容

public func closeGraph() {
   dispatchQueue.main.sync{_closeGraph()}
}

这很容易,但是如果用户交互触发了它,而我已经在主线程上了,该怎么办。 ++不好。

public func closeGraph() {
    if Thread.isMainThread {
        _closeGraph()
    } else {
        dispatchQueue.main.sync{_closeGraph()}
    }
}

糟糕,openGraph()抛出...

public func openGraph() throws  {
    do {
        if Thread.isMainThread {
            try _openGraph()
        } else {
            try dispatchQueue.main.sync{try _openGraph()}
        }
    } catch {
        throw error
    }
}

有没有更好的方法,所以我不必复制粘贴到任何地方?

解决方法

您可以将支票提取为通用函数,如下所示:

public func mainQueue(execute block: () throws -> Void) rethrows {
    if Thread.isMainThread {
        try block()
    } else {
        try DispatchQueue.main.sync{ try block() }
    }
}

然后,如果您的_closeGraph()函数没有引发任何错误,则您的代码将如下所示:

public func closeGraph() {
    mainQueue(execute: _closeGraph)
}

,如果您的_closeGraph()函数throws,您的代码将如下所示:

public func closeGraph() {
    do {
        try mainQueue(execute: _closeGraph)
    } catch {
        print(error)
    }
}

如您所见,您每次都需要编写throwing函数的处理。

更新:如果您打算处理一般错误,则可以在do-catch函数中隐藏mainQueue(execute:)语句,如下所示:

public func mainQueue(execute block: () throws -> Void) {
    do {
        if Thread.isMainThread {
            try block()
        } else {
            try DispatchQueue.main.sync{ try block() }
        }
    } catch {
        print(error)
    }
}

然后调用此函数将与_closeGraph()函数是否抛出相同:

public func closeGraph() {
    mainQueue(execute: _closeGraph)
}