NSFetchedResultsController 的瞬态属性上的 NSSortDescriptor
Posted
技术标签:
【中文标题】NSFetchedResultsController 的瞬态属性上的 NSSortDescriptor【英文标题】:NSSortDescriptor on transient attribute for NSFetchedResultsController 【发布时间】:2013-07-25 01:53:57 【问题描述】:好的,我最初想让NSSortDescriptor
请求NSFetchedResultsController
根据我的NSManagedObject
子类中的属性进行排序,但显然不会这样做,因为 NSFetchedResultsController 仅限于谓词和排序对获取的实体及其关系起作用的描述符,因此我决定在我的数据模型中创建一个瞬态属性,将该属性的属性综合到我的NSManagedObject
子类中的 ivar,并根据它进行排序。
运行它时,我在执行 fetch 'NSInvalidArgumentException', reason: 'keypath isActive not found in entity <NSSQLEntity SMSourceEntity id=2>'
时得到了
我知道这是 KVO 问题,所以我添加了+ (NSSet*)keyPathsForValuesAffectingIsActive
,但仍然遇到同样的问题。
我做错了什么,或者我仍然缺少一些东西让它找到我的密钥路径?谢谢。
代码:
@implementation SMSourceEntity
@dynamic friendlyName;
@dynamic interfaceAddress;
@dynamic uniqueID;
@dynamic network;
@synthesize isActive = _isActive;
+ (NSSet*)keyPathsForValuesAffectingIsActive
return [NSSet setWithObject:@"isActive"];
@end
我的排序描述符:
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"isActive" ascending:NO] , nil];
【问题讨论】:
【参考方案1】:这不是KVO
问题,而是您尝试执行的操作的问题,因为 FRC 要求可以将排序应用于底层 SQLite 存储。换句话说,您只能对非瞬态属性进行过滤和排序。您需要将属性设为非瞬态,以便将其值保存到存储中并可供 SQLite 使用。
对于 FRC,只有节名键路径属性可以是瞬态的。
【讨论】:
谢谢,所以如果我想让瞬态属性与我的 FRC 一起使用,我必须对其进行子类化,获取获取的结果,然后根据我在 didChangeContent:? 中的属性对获取的对象数组进行排序。有意义吗? 我认为这很难做到,因为您将不得不编写大量代码或放弃使用 FRC 的大部分好处(例如分页按需加载)。您可能应该根据具体情况考虑其他选项。就像为不同的部分使用多个 FRC 或类似的东西。以上是关于NSFetchedResultsController 的瞬态属性上的 NSSortDescriptor的主要内容,如果未能解决你的问题,请参考以下文章