【问题标题】:NSArray count returns correct number but faults with data accessNSArray 计数返回正确的数字,但数据访问出错
【发布时间】:2026-01-07 15:20:05
【问题描述】:

我正在尝试获取数组中的项目计数,以将其放置在 cellright detail 中。有趣的是,我得到了正确的count,但是当我尝试NSLog 时,它返回的数组是<fault>

NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"muscleGroup == %@ && specificExercise == %@ && date >= %@ && date < %@", theMuscleGroup, theExercise, fromDate, toDate];

NSFetchRequest *fetchRequestTemp = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"WeightLiftingInfo" inManagedObjectContext:_managedObjectContext];

[fetchRequestTemp setPredicate:searchPredicate];
[fetchRequestTemp setEntity:entity];
NSError *error;
NSArray *tempArray = [[NSArray alloc] initWithArray:[_managedObjectContext executeFetchRequest:fetchRequestTemp error:&error]];

NSLog(@"%@", tempArray);
NSLog(@"%d", [tempArray count]);

我的问题: 基本上,我做错了什么?我是在不正确地初始化阵列还是试图不正确地记录它?

我已经研究了几个小时并尝试了不同的编码,但无法弄清楚。任何帮助,将不胜感激。 如果您需要更多信息,或者我正在根据 SO 执行违反指南的操作,请在关闭此线程或“-1”之前告诉我。有怜悯,我是新来的人:)

【问题讨论】:

  • 可能是数组对象在不同的​​线程上。 Core Data 不支持“开箱即用”的多线程。你在使用多线程吗?您是否在实际使用结果而不是记录结果时遇到问题?
  • @ilias 我没有尝试使用它们,因为我认为访问时会出错。请参阅下面我对 caleb 的回复,因为我会进一步解释。

标签: objective-c nsarray nsmanagedobjectcontext


【解决方案1】:

当你执行你的获取请求时,你会得到一个managed object fault。也就是说,即使还没有从数据存储中加载真正的数据对象,也可以表示结果的类似代理的对象。故障知道数组中有多少对象等等,当你访问对象时故障会透明地加载真实的对象。

所以,情况正常,不用担心。尝试使用结果而不是记录它们,我想你会发现一切正常。

【讨论】:

  • 谢谢!我实际上只需要计数,所以我没有使用结果。我不确定我是否需要担心这个&lt;fault&gt;
  • 没问题。使 Core Data 快速的一件事是它延迟加载数据,直到你真正需要它。顺便说一句,我怀疑您是否需要整个 initWithArray: 位...只需使用执行 fetch 后返回的数组即可。
  • 这是你的意思吗? NSArray *tempArray = [_managedObjectContext executeFetchRequest:fetchRequestTemp error:&amp;error];?如果有,有什么区别?
  • 正确——你明白了。 MOC 为您提供一个数组,因此无需创建另一个数组,尤其是因为您只需要计数。