我有这些方法:
open func promptNow() throws {
// show an alert view
}
open func promptAfter(dalay: TimeInterval) throws {
try self.promptNow()
}
这段代码编译得很好,但显然我需要在异步块中调用try self.promptNow()
,例如:
open func promptAfter(dalay: TimeInterval) throws {
let dispatchTime = DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
queue.asyncAfter(deadline: dispatchTime) {
try self.promptNow()
}
}
这会产生错误:
投掷函数类型()的转换无效 - > throws()to 非投掷函数类型() - > Void
如何解决此问题?
答案 0 :(得分:5)
你不能使异步函数可抛出,因为这个函数的调用者会在调用异步方法后立即继续执行,因此无法捕获异步方法返回后会抛出的错误。
你可以指定你的函数将闭包作为输入参数和make that closure throwable,或者在函数内处理错误而不是重新抛出它。
下面的所有代码都是用Swift3编写的。我已使用main
线程执行promptNow
,因为如果您要呈现警报控制器,则需要在主线程上执行。
可抛出的闭包解决方案(因为您实际上并没有使用闭包来返回任何值,我不建议使用此解决方案):
open func promptAfter(delay: TimeInterval, completion: @escaping (_ inner: () throws -> Void) -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now()+delay) {
do {
try self.promptNow()
completion({})
} catch {
completion({throw error})
}
}
}
你这样称呼它:
promptAfter(delay: 5, completion: { inner in
do {
try inner()
} catch {
print(error)
}
})
处理promptAfter
内的错误的解决方案:
open func promptAfter(delay: TimeInterval) {
DispatchQueue.main.asyncAfter(deadline: .now()+delay) {
do {
try self.promptNow()
} catch {
print(error)
}
}
}