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

CoreData / NSManagedObject mapping, how to check if the object property supports the passed type

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

感谢您的帮助。

这是 NSAttributeDescription 的目的,您可以通过实体的 NSEntityDescriptionpropertiesByName 达到此目的。它会告诉您可用于验证/比较的 attributeType。另请参阅 attributeValueClassName,您可以利用它。