在iOS中的Core Data上对NSArray实体进行快速枚举时出现运行时错误

问题描述 投票:0回答:2

我有一个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;
    }
}

为什么我会收到上述错误?

ios core-data nsmanagedobject fast-enumeration
2个回答
0
投票

代码中有一个拼写错误,你填充self.entityAray,从self.entityArray中绘制。这是你的例子中的一个小错字,或者它解释了你的错误。当寻找self.entityArray它找不到它因为拼写错误引发NSInalidArgumentException


0
投票

它说明错误消息中的错误。

你有一个类My_Entity_NameMy_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;(返回数组的第一个元素)(返回整个数组)。

© www.soinside.com 2019 - 2024. All rights reserved.