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)
}
我有一些代码正在重复。我想更新主线程上的东西,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)
}