Swift 调度主

Swift Dispatch Main

我有一些代码正在重复。我想更新主线程上的东西,UI stuff.

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)
    }
}

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

更新:如果你有一个通用的错误处理,你可以在mainQueue(execute:)函数中隐藏do-catch语句,像这样:

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)
}