executeFetchRequest 不适用于 propertiesToFetch
Posted
技术标签:
【中文标题】executeFetchRequest 不适用于 propertiesToFetch【英文标题】:executeFetchRequest is not working with propertiesToFetch 【发布时间】:2014-02-20 12:50:03 【问题描述】:我已在我的应用程序中集成了 coreData。我在主线程中运行NSManagedObjectContext
。
-(NSArray *) getResultForContext:(NSManagedObjectContext *)context
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Person"];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[request setEntity:entity];
NSError *fetchError;
NSArray *allObjects = [self executeFetchRequest:request error:&fetchError];
return allObjects;
上述方法工作正常,但如果我将propertiesToFetch
添加到请求中,executeFetchRequest
返回一个空数组。
-(NSArray *) getResultForContext:(NSManagedObjectContext *)context
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Person"];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
[request setPropertiesToFetch:@[@"firstName",@"lastName"]];
NSError *fetchError;
NSArray *allObjects = [self executeFetchRequest:request error:&fetchError];
return allObjects;
这个方法返回一个空。
这里缺少什么?
【问题讨论】:
告诉我对这个方法的调用,你的 MOC 分配在哪里?如果您处于多线程环境中,您应该知道 MOC 不是线程安全的,因此如果您从创建 MOC 的线程以外的线程调用此方法,那么您可能会遇到一些奇怪的行为,例如您所拥有的... 【参考方案1】:假设 (1) 数据存在(即实际上有一些 Person
实例要获取)并且 (2) 结果实际上是一个空数组而不是 nil
:
我知道在第一种情况下获取非空数组但在第二种情况下获取空数组的唯一方法是列出的属性对于 all 实例都是 nil
。在这种情况下,没有值,因此对 setReturnsDistinctResult
的调用有效地过滤掉了每个结果(因为 nil
不被视为不同的结果)。
如果任何现有Person
实例的任一属性都不是nil
,您将获得一个非空数组。但如果没有要获取的属性值,则没有不同的结果,结果为空。
如果结果实际上是nil
,而不是空数组,请查看fetchError
以获取线索。
【讨论】:
【参考方案2】:问题来自 NSDictionaryResultType。 正如 this post 上的 bbarnhart 所说,在使用 resultType NSDictionaryResultType 之前,您必须将上下文保存到持久存储中。
也要注意上下文 persistentStoreCoordinator 的声明。
【讨论】:
以上是关于executeFetchRequest 不适用于 propertiesToFetch的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 executeFetchRequest 致命错误
NSPredicate,executeFetchRequest 崩溃
executeFetchRequest 挂起并且从不返回错误或继续