【问题标题】:NSSortDescriptor on transient attribute for NSFetchedResultsControllerNSFetchedResultsController 的瞬态属性上的 NSSortDescriptor
【发布时间】:2023-03-19 03:46:01
【问题描述】:

好的,我最初想让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];

【问题讨论】:

    标签: ios objective-c key-value-observing nssortdescriptor transient


    【解决方案1】:

    这不是KVO 问题,而是您尝试执行的操作的问题,因为 FRC 要求可以将排序应用于底层 SQLite 存储。换句话说,您只能对非瞬态属性进行过滤和排序。您需要将属性设为非瞬态,以便将其值保存到存储中并可供 SQLite 使用。

    对于 FRC,只有节名键路径属性可以是瞬态的。

    【讨论】:

    • 谢谢,所以如果我想让瞬态属性与我的 FRC 一起使用,我必须对其进行子类化,获取获取的结果,然后根据我在 didChangeContent:? 中的属性对获取的对象数组进行排序。有意义吗?
    • 我认为这很难做到,因为您将不得不编写大量代码或放弃使用 FRC 的大部分好处(例如分页按需加载)。您可能应该根据具体情况考虑其他选项。就像为不同的部分使用多个 FRC 或类似的东西。
    猜你喜欢
    • 2012-05-15
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多