NSOrderedSet不会构建由XCode生成的iPhone类

时间:2011-09-12 18:10:04

标签: ios xcode core-data xcode4

我在Lion上的XCode 4.1中创建了一个具有1-many关系的简单数据模型。

为此关系生成的属性类型是NSOrderedSet,由于类型未知,因此无法编译。

我搜索了文档,了解这是为Mac OS 10.7(Lion)添加的一种新的集合类,在托管对象中特别有用(我只是习惯了Apple的工作方式:像基本的一样语言中的集合类型绑定到OS发布...有趣的)

这是有道理的,NdOrderedSet显然是NSSet和NSArray的特性的组合 - 也就是说,它具有像数组一样的索引顺序,每个元素都像集合一样唯一。尼斯。但是,我的问题是:

  1. 为什么不编译?
  2. 为什么XCode会生成无法编译的内容?

    我自己会在#1上采取行动:我的SDK是iOS 4.3,早于Lion(并非Mac OS而是iOS),并且根本没有这个新的集合类。 好吧,公平,但#2代表:为什么XCode会为我生成它?为什么不检测我的SDK并生成有效的东西?为什么不给我一个选择?

    这将我带到#3和#4

  3. 解决方法是什么?我应该将其更改为NSSet或NSArray吗? XCode是如何在4.0之前生成这些东西的?

  4. 如果我使用NSOrderedSet(即以某种方式让它工作)它会向后兼容以前的iOS版本吗?

2 个答案:

答案 0 :(得分:1)

核心数据有序关系仅适用于iOS 5,而不适用于iOS 4.3。 您需要iOS 5 SDK,它仅适用于Xcode 4.2。从Xcode 4.1切换到Xcode 4.2,你应该没问题。

3:解决方法是使用Xcode 4.2并定位iOS 5.如果您仍想要定位iOS 4.x并订购关系,请继续阅读。

4:你不太可能让NSOrderedSet在iOS 4.3中运行。 Cocoa Touch完全没有上课。所以你需要从头开始重新实现它,这绝对是可行的。 可行的是,然后让Core Data使用它。所以忘了它。

现在,值得一提的是 可以定义与“旧”核心数据的有序关系。它需要更多的工作,但它绝对可行。这是一个例子:

想象一下MealCourse个实体。一顿饭与课程有着有序的关系,因为用餐期间的课程按特定顺序出现。你不想在主菜之前吃甜点!

这个想法是定义一个第三个帮助实体,代表餐中的课程成员资格。我们称之为实体CourseInMeal。现在设置以下关系:

Course <--------->> CourseInMeal <<----------> Meal

双箭头表示关系的“对多”结束。

这些关系基本上表示课程可以在几餐中出现,而且一顿饭可以有几道菜。

唯一剩下的就是代表有序关系。为此,只需向CourseInMeal实体添加一个属性,可能称为position

现在,当您想要定义一顿新餐时,您可以为用餐中的每个课程创建一个CourseInMeal的新实例,其中包括:

CourseInMeal *newMealMembership = [CourseInMeal insertInManagedObjectContext:self.moc];
newMealMembership.course = myDessert;
newMealMembership.meal = myBirthdayMeal;
newMealMembership.position = 3; // or whatever
[self.moc save:NULL];

Voilà,你在普通的核心数据中有一个有序的关系。

答案 1 :(得分:0)

我刚试了一下。我的结果是NSSet,而不是NSOrderedSet

也许您应该检查项目设置,特别是标题体系结构下的项目。 (选择项目,构建设置,体系结构基础SDK ,以及支持的平台)。