gpt4 book ai didi

ios - 尝试 block 无法正常工作

转载 作者:行者123 更新时间:2023-11-28 06:38:04 24 4
gpt4 key购买 nike

我正在开发一个通过 NSURLSession 调用 api 的应用程序。当 Api 正常工作时,没有问题,但是当由于任何错误而没有收到数据时,在序列化之后它会抛出错误,但永远不会调用它的 else block

 let task = session.dataTaskWithRequest(request) { (let data, let response,  let error) in


do {
guard let data:NSData = data , let response: NSURLResponse = response where error == nil else {
throw error!
}

guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else{
print("Serialization failed") //This block never executes even if the Serialization Fails
throw JSONError.ConversionFailed

}

guard json.valueForKey("success") != nil else {
return
}


self.apidata = json
dispatch_async(dispatch_get_main_queue()){
self.tableView.reloadData()
}
print(json.valueForKey("success")!)

}
catch let error as JSONError{
self.showalertview(error.rawValue)
print(error.rawValue)
} catch let error as NSError{


print(error.debugDescription)
}
}

task.resume()

我在这里做错了什么???

最佳答案

考虑:

do {
guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
// A
}
} catch {
// B
}

如果 NSJSONSerialization 抛出错误(即如果它不是真正的 JSON 响应或响应格式不正确),它将直接进行到 Bguard 语句不起作用。 guard 语句只会执行 A 当且仅当 (a) NSJSONSerialization 调用本身没有抛出任何错误(即JSON 格式正确);但是 (b) 转换为字典失败(例如,顶级 JSON 对象是数组而不是字典)。这是一种极不可能发生的情况(您的服务器将不得不意外地返回格式正确的 JSON 响应,该响应不是字典,例如 JSON 数组)。


为了完成你想要的,你可以使用 try? 来确保 NSJSONSerialization 本身不会抛出任何错误:

do {
guard let json = try? NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
// A
throw JSONError.ConversionFailed
}
} catch {
// B
}

通过这样做,只有当A执行throw时才会调用B

关于ios - 尝试 block 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38651941/

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