我编写了一些代码来将数据从服务器映射到我的CoreData对象,这一切都按预期工作。但是,我在日志中收到了很多无法识别的选择器警告。这主要是由于服务器具有不同对象类型的相同键名。我的代码如下:
for (id key in dict)
{
if ([UsefulFunctions objectContainsData:dict[key]])
{
if (mapping[key])
{
SEL selector = NSSelectorFromString(mapping[key]);
if ([entity respondsToSelector:selector])
{
@try {
// try and set the value, might not work if dict[key] is unexpected type
[entity setValue:dict[key] forKey:mapping[key]];
}
@catch (NSException *exception) {
// deal with the exception
}
}
}
}
}
基本上,这段代码的作用是循环访问服务器传递的对象的“dict”。它检查它们是否包含数据,然后根据我设置的映射字典创建选择器(示例如下):
@"id" : @"nID",
然后检查实体(NSManagedObject)是否响应创建的选择器(例如nID),然后尝试应用数据来检查它的有效性。就像提到的一样,这一切都很好,但是,由于类型不匹配,我在日志中打印出许多恼人的错误。有没有更好的方法来测试NSManagedObject是否可以处理传递给它的数据?
例如,nID包含一个数字,但如果服务器传递一个字符串,那么应用程序就会崩溃。所以我把它包装在try / catch中以阻止这种情况发生。没有try / catch有没有办法做同样的事情,或者这是正确的方法吗?我不只是想抑制警告。
感谢您的帮助。
答案 0 :(得分:1)
NSAttributeDescription
的目的是通过propertiesByName
NSEntityDescription
获取该实体的目的。它会告诉您可以用于验证/比较的attributeType
。另请参阅attributeValueClassName
,您可以利用它。