我有一个NSArray的NSManagedObject类型的对象,它是从我在Core Data中执行的获取结果返回的。 NSArray包含对象,因为我能够在查询之后通过将NSArray的内容打印到控制台来验证它。然而,我的问题是我无法使用从查询中检索到的实体类型的对象对此数组进行快速枚举。我在运行时得到的确切错误如下:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[My_Entity_Name countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0xa9f0090'
我正在使用的for循环甚至没有运行,因为它在for循环条件下中断:
for (MyEntityType *entityType in self.entityArray) {
...
}
我用来填充数组self.entityArray的实际fetch命令是:
self.entityArray = [[Singleton sharedInstance] retrieveEntities:self.mainEntity.relationshipEntity.relationshipEntityId];
反过来,这是我的retrieveEntity方法的样子:
- (NSArray *)retrieveEntities:(NSNumber *)relationshipEntityAttributeId {
NSManagedObjectContext *context = [[DataEngine sharedInstance] managedObjectContext];
NSError *error;
// Create fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:context];
[fetchRequest setEntity:entity];
// Create predicate
NSPredicate *pred = [NSPredicate predicateWithFormat:@"relationshipEntity.relationshipAttributeId == %@", relationshipEntityAttributeId];
[fetchRequest setPredicate:pred];
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
if ([items count]>0) {
return items[0];
} else {
return nil;
}
}
为什么我会收到上述错误?
代码中有一个拼写错误,你填充self.entityAray,从self.entityArray中绘制。这是你的例子中的一个小错字,或者它解释了你的错误。当寻找self.entityArray它找不到它因为拼写错误引发NSInalidArgumentException
它说明错误消息中的错误。
你有一个类My_Entity_Name
。 My_Entity_Name
的一个实例被分配给属性self.entityArray
。当你执行for (MyEntityType *entityType in self.entityArray)
时,它将-countByEnumeratingWithState:objects:count:
消息传递给实例,并且您得到无法识别的选择器错误。
我会寻找分配值的地方(self.entityArray = …
或[self setEntityArray:…]
)来弄清楚self.entityArray
如何获得不好的价值。也许您应该发布如何进行获取,或者是否有其他方式可以为self.entityArray
分配值。
UPDATE
我不确定-[Singleton retrieveEntity:]
会做什么。它不是标准框架的一部分,我不知道任何使用这种通用命名的第三方库。
我可以告诉你的是,基于方法名称-retrieveEntity:
,它看起来像返回一个对象而不是一个对象数组。通常返回数组的方法是复数的,所以我希望这个名字更像-retrieveEntities:
。
你有一个例外,因为self.entityArray
不包含NSArray
。方法名称看起来不会返回数组。
你绝对相信[[Singleton sharedInstance] retrieveEntity:…]
应该回归NSArray
吗?也许你应该发布-retrieveEntity:
的代码。
UPDATE
你没有返回一个数组。
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
if ([items count]>0) {
return items[0];
} else {
return nil;
}
如果items数组包含任何元素,则返回第一个元素。这就是items[0]
所做的。
如果要返回数组,请将其更改为:
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
if ([items count]>0) {
return items;
} else {
return nil;
}
注意我用return items[0];
替换了return items;
(返回数组的第一个元素)(返回整个数组)。