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