当我的服务器收到包含空值的答案时(在JSON响应中),RestKit内部映射在处理null值时崩溃。
有没有办法克服这个问题?
我试过扩展NSNull以包含"缺失"方法,但这不起作用,似乎是错误的。
以下是我的映射和目标代码以及restkit输出:
对象映射:
var tempmapping = RKObjectMapping(forClass: PRLAUser.classForCoder())
tempmapping.addAttributeMappingsFromDictionary([
"firstName" : "firstName",
"secondName" : "lastName",
"email" : "email",
"id" : "prlaToken"
])
目标代码 - 至少是要映射的变量:
var email : String?
var firstName : String?
var lastName : String?
var prlaToken : String?
崩溃日志:
Parola[6138:3119821] -[NSNull length]: unrecognized selector sent to instance 0x197b86ba0
2015-01-20 15:53:37.973 Parola [6138:3119821] *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [NSNull length]:无法识别的选择器发送到实例0x197b86ba0' * 第一次抛出调用堆栈: (0x1867fa59c 0x196f040e4 0x186801664 0x1867fe418 0x186702b6c 0x100707964 0x100023dc8 0x187605b10 0x1000a34a0 0x1000a4078 0x1000a99d4 0x1000a8dfc 0x10009a8f4 0x1000995a8 0x10009bbb4 0x10009c294 0x10009ca84 0x1875f461c 0x1000e4754 0x1000e2acc 0x1875f461c 0x1876b626c 0x1007b4df0 0x1007bf854 0x1007b8120 0x1007c175c 0x1007c2f18 0x1977252e4 0x197724fa8) libc ++ abi.dylib:以NSException类型的未捕获异常终止
非常感谢有关此事的任何协助。
答案 0 :(得分:2)
版本0.23.1适用于您。 我在RestKit github页面上发布了临时修复问题。
https://github.com/RestKit/RestKit/issues/2155
在一个将NSNull变为String的对象中,我做了类似这样的事情
public override func validateValue(ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>, forKeyPath inKeyPath: String, error outError: NSErrorPointer) -> Bool {
if let memory = ioValue.memory {
if inKeyPath == "hint" && ioValue.memory is NSNull {
ioValue.memory = nil
return true
}
}
return super.validateValue(ioValue, forKeyPath: inKeyPath, error: outError)
}
您还可以在要求
时更改RKMappingOperationDataSource
以在代表NO中返回
- (BOOL)mappingOperationShouldSetUnchangedValues:(RKMappingOperation *)mappingOperation;
顺便说一句。这个问题已经存在于Stack:RestKit JSON null value crash
答案 1 :(得分:0)
如果服务器向您发送空值,您首先必须确定它的真正含义。例如,如果您希望字典中有字符串,那么该键可能不存在,值可能为null,值可能是空字符串,您需要决定是否要将这些情况视为相同或不相同。设计JSON数据的人实际上可能希望您以不同方式处理空值。
之后,直接的事情是通过比较if(object ==(id)[NSNull null])或者通过向NSDictionary添加一个类别来检查空值,NSDictionary为你做检查并返回你想要的任何值。