尝试异步捕获

时间:2017-09-11 15:55:54

标签: swift try-catch

我有这些方法:

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

如何解决此问题?

1 个答案:

答案 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)
        }
    }
}
相关问题