gpt4 book ai didi

swift - 子类 AFNetworking JSON 响应序列化,将 JSON 响应正文插入到 Swift 2 中的错误数据中

转载 作者:行者123 更新时间:2023-11-30 10:11:33 25 4
gpt4 key购买 nike

AFNetworking 失败时不会返回 JSON 响应正文(例如 400 状态代码),因此您必须子类化 AFJSONResponseSerializer 并用此类填充错误对象。这是推荐的here一个例子是 here

直到 Swift 2,我使用以下代码来实现:

import Foundation

let JSONResponseSerializerWithDataKey : String = "JSONResponseSerializerWithDataKey"
let JSONResponseUndefinedAPIFailureReason : String = "UNKNOWN_ERROR"

class JSONResponseSerializerWithData: AFJSONResponseSerializer
{
override func responseObjectForResponse (response: NSURLResponse, data: NSData, error: AutoreleasingUnsafeMutablePointer
<NSError?>) -> AnyObject
{
var json : AnyObject = super.responseObjectForResponse(response, data: data, error: error) as AnyObject

if (error.memory? != nil)
{
var errorValue = error.memory!
var userInfo = errorValue.userInfo
if let errorDetail = json["detail"] as? String
{
userInfo![JSONResponseSerializerWithDataKey] = errorDetail
}
else
{
userInfo![JSONResponseSerializerWithDataKey] = JSONResponseUndefinedAPIFailureReason
}
error.memory = NSError(domain: errorValue.domain, code: errorValue.code, userInfo: userInfo)
}
return json
}
}

从 Swift 2 开始,引入了一种新的错误处理类型。上述函数的签名现在是:

override func responseObjectForResponse(response: NSURLResponse!, data: NSData!) throws -> AnyObject

我在 do-catch 语句中无法实现与上述相同的效果,因为失败似乎不会调用 catch 语句,因此无法访问错误对象。此外,新的 ErrorType 本质上是空的并且不包含

这是我尝试过的,但从未调用 catch 语句:

class JSONResponseSerializerWithData: AFJSONResponseSerializer
{
override func responseObjectForResponse(response: NSURLResponse!, data: NSData!) throws -> AnyObject
{
do
{
return try super.responseObjectForResponse(response, data: data)
}
catch
{
let nsError = (error as NSError)
var userInfo = nsError.userInfo
if let errorDetail = userInfo["detail"] as? String
{

userInfo[JSONResponseSerializerWithDataKey] = errorDetail
}
else
{
userInfo[JSONResponseSerializerWithDataKey] = JSONResponseUndefinedAPIFailureReason
}

throw NSError(domain: nsError.domain, code: nsError.code, userInfo: userInfo)
}
}
}

我尝试单步执行 AFNetworking2 库,响应正文就在那里,因此我可以在 Objective-C 而不是 Swift 中对其进行子类化,但如果可能的话,我更愿意这样做。

enter image description here

我是否使用 do-catch 语句错误地处理了这个问题?任何正确方向的指针将不胜感激。

最佳答案

经过更多挖掘,我发现问题如描述的 here .

错误不会被抛出,只会被填充,因此 catch 永远不会被调用。要引发这种旧行为,您可以将“NS_SWIFT_NOTHROW”添加到头文件中 Objective-C 签名的末尾,如here所述。

这会将签名更改为:

override func responseObjectForResponse(response: NSURLResponse?, data: NSData?, error: NSErrorPointer) -> AnyObject?

然后就可以像以前一样使用了。

关于swift - 子类 AFNetworking JSON 响应序列化,将 JSON 响应正文插入到 Swift 2 中的错误数据中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32761236/

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