gpt4 book ai didi

ios - 错误处理 - 异步调用

转载 作者:搜寻专家 更新时间:2023-10-31 08:15:31 24 4
gpt4 key购买 nike

我正在为我的项目中使用的网络服务创建一个框架。我已经在 GitHub 上传了模板。 https://github.com/vivinjeganathan/ErrorHandling

它有不同的层次。第 1 层用于验证。第 2 层用于形成请求。第 3 层用于实际的网络调用。

View Controller <---->第一层<--->第二层<--->第三层

数据通过闭包在层与层之间流动,如果任何层发生错误,都需要优雅地传递给ViewController。

我已引用此链接以了解异步调用中的错误处理 - http://appventure.me/2015/06/19/swift-try-catch-asynchronous-closures/ 在同一个仓库中创建了一个分支 - 名称 - ErrorHandling-Method1。

我能够将错误从第 3 层转移到第 2 层(单层 - 通过闭包中的函数返回响应 - 如链接中所述)。但在跨多层传输回时面临困难。

任何人都可以协助处理公共(public) GitHub 中提供的示例应用程序吗?

最佳答案

首先,我认为没有必要像您那样堆叠层,例如,通过将验证功能添加为一个层,您正在增加耦合,使该层依赖于下面的层(解析、网络)等),相反,为什么不分开验证以使其仅依赖于数据?:

class ViewController: UIViewController {

var validator = InputValidator()

override func viewDidLoad() {
super.viewDidLoad()

do {
try validator.validateInput("INPUT")
try Fetcher.requestDataWithParams("INPUT")
}
catch {
handleError(error)
}
}
}

现在验证功能不依赖于其他层,因此通信将像这样进行:

View Controller <---> 解析层<---> 网络层

我确实重命名了层,但它们不一定必须是这样,您可以添加或删除层。

我认为如果我试图解释我的方法会有点复杂,所以我将使用前面的层给出一个例子,首先是底层:

class NetworkingLayer {
class func requestData(params: AnyObject, completion: (getResult: () throw -> AnyObject) -> Void) -> Void {
session.dataTaskWithURL(url) { (data, urlResponse, var error) in
if let error = error {
completion(getResult: { throw error })
} else {
completion(getResult: { return data })
}
}
}
}

我省略了一些代码部分,但我的想法是执行任何必要的步骤以使该层工作(创建 session 等)并始终通过完成闭包进行通信;顶层看起来像这样:

class ParsingLayer {
class func requestObject(params: AnyObject, completion: (getObject: () throw -> CustomObject) -> Void) -> Void {
NetworkingLayer.requestData(params, completion: { (getResult) -> Void in
do {
let data = try getResult()
let object = try self.parseData(data)
completion(getObject: { return object })
}
catch {
completion(getObject: { throw error })
}
})
}
}

注意完成闭包是不一样的,因为每一层都增加了功能,返回的对象可能会改变,还要注意 do 语句中的代码可能会以两种方式失败,首先如果网络调用失败,然后无法解析来自网络层的数据;同样,与顶层的通信始终通过完成闭包完成。

最后,ViewController 可以使用在这种情况下解析层所期望的闭包来调用下一层,并且能够处理源自任何层的错误:

override func viewDidLoad() {
super.viewDidLoad()
do {
try validator.validateInput("INPUT")
try ParsingLayer.requestObject("INPUT", completion: { (getObject) in
do {
let object = try getObject()
try self.validator.validateOutput(object)
print(object)
}
catch {
self.handleError(error)
}
})
catch {
handleError(error)
}
}

请注意,在完成闭包中有一个 do catch,这是必需的,因为调用是异步进行的,现在响应已经通过所有层并且实际上已经变成了一个更专业的类型,您甚至可以验证结果,而无需为验证功能创建一个层。

希望对您有所帮助。

关于ios - 错误处理 - 异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com