CoreData / NSManagedObject映射,如何检查对象属性是否支持传递的类型

时间:2015-11-25 09:42:22

标签: core-data try-catch nsmanagedobject

我编写了一些代码来将数据从服务器映射到我的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有没有办法做同样的事情,或者这是正确的方法吗?我不只是想抑制警告。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

NSAttributeDescription的目的是通过propertiesByName NSEntityDescription获取该实体的目的。它会告诉您可以用于验证/比较的attributeType。另请参阅attributeValueClassName,您可以利用它。