我有一个核心数据对象,它有一堆可选值。我正在推送一个表视图控制器并向它传递一个对象的引用,以便我可以在表视图中显示它的内容。因为我希望以特定方式显示表视图,所以我将核心数据对象中的值存储到字典数组中,然后使用该数组填充表视图。这很好用,我编辑和保存工作正常。 (我没有使用获取的结果控制器,因为我没有任何可以排序的东西)
我当前代码的问题是,如果对象中的某个项目丢失,那么我最终会尝试将nil放入字典中,这将无效。
我正在寻找一种干净的方法来处理这个问题,我可以做到以下几点,但我不禁感觉有更好的方法。
* passedEntry是在推送时传递给视图控制器的核心数据对象,假设它包含firstName,lastName和age,都是可选的。
if ([passedEntry firstName] != nil) {
[dictionary setObject:[passedEntry firstName] forKey:@"firstName"]
}
else {
[dictionary setObject:@"" forKey:@"firstName"]
}
等等。这很有效,但感觉很糟糕,特别是如果我最终在核心数据对象中添加更多项目的话。
答案 0 :(得分:5)
您可以做的是使用objc_*
运行时函数迭代所有对象的属性,如下所示:
unsigned int property_count;
objc_property_t * prop_list = class_copyPropertyList([CoreDataObject class], &property_count);
for(int i = 0; i < property_count; i++) {
objc_property_t prop = prop_list[i];
NSString *property_name = [NSString stringWithCString:property_getName(prop) encoding:NSUTF8StringEncoding];
id obj = [passedEntry valueForKey:property_name];
[dictionary setObject:((obj != nil) ? obj : [NSNull null]) forKey:property_name];
}
free(prop_list);