迅速派遣总队

问题描述

我有重复的代码。我想更新主线程上的内容,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)
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...