对支持 CoreData 的 NSArrayController 进行排序时遇到问题

Posted

技术标签:

【中文标题】对支持 CoreData 的 NSArrayController 进行排序时遇到问题【英文标题】:Having Trouble Sorting CoreData backed NSArrayController 【发布时间】:2014-07-06 21:21:33 【问题描述】:

我试图从我的 Core Data 支持的 NSArrayController 中检索排序对象数组。一旦 ManagedObjectContext 准备就绪,我会触发一个通知,拥有 NSArrayController 的对象会监听该通知,然后使用 sortDescriptors 设置获取请求。但是,数据永远不会排序。我已经为此苦苦思考了好几个小时了。

我得到了数组中的预期数据,但它根本没有排序。有人知道我哪里出错了吗?

// Elsewhere in code
...
_charts = [[NSArrayController alloc] init];
_charts.entityName = @"Charts";
...

// When Cored Data and Managed Object Context is ready
-(void)mangagedObjectContextReady

    NSManagedObjectContext *moc = ((AppDelegate *)[NSApp delegate]).managedObjectContext;
    _charts.managedObjectContext = moc;
    _charts.usesLazyFetching = NO;
    _charts.automaticallyPreparesContent = YES;
    _charts.automaticallyRearrangesObjects = YES;

    // Create fetch request for data
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    fetchRequest.entity = [NSEntityDescription entityForName:@"Charts" inManagedObjectContext:moc];

    // Create the sort descriptors for the Charts entity
    // Name and chartType are properties on the entity "Charts"
    NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
    NSSortDescriptor *chartTypeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"chartType" ascending:YES selector:@selector(caseInsensitiveCompare:)];
    fetchRequest.sortDescriptors = @[nameDescriptor, chartTypeDescriptor];

    NSError *error = nil;
    BOOL success = [_charts fetchWithRequest:fetchRequest merge:NO error:&error];
    if(!success)
        NSLog(@"Error %@:", [error localizedDescription]);
    else 
       [_charts rearrangeObjects];
       [_tv reloadData];
    

我使用这个方法来获取一个数组或排序的对象..但是数据没有按照上面的排序描述符排序?

[_charts.arrangedObjects objectAtIndex:row]

【问题讨论】:

【参考方案1】:

_charts.sortDescriptors = @[nameDescriptor, chartTypeDescriptor];

【讨论】:

哇,这几乎是显而易见的。我认为将排序描述符放在获取请求上应该在将数据插入到 Arraycontroller 时对数据进行排序。至少所有文档都是这么说的? 您确实会从 fetch 中获得排序结果。重排数组控制器大概有自己的排序思路吧。 我没有。我注释掉在 ArrayController 上设置 sortDescriptors 以及所有这些标志 re autoPrepareContent、autoRearrange 和对 [_charts rerangedObjects] 的调用,并使用 [_charts mappedObjects] 并且数据未排序。似乎只是忽略了 fetchRequest 上的 sortDescriptors?可能是时候提交错误报告了。 [managedObjectContext executeFetchRequest:request error:&error] 应该给出排序结果。 [arrayController fetchWithRequest:fetchRequest merge:NO er​​ror:&error] 可能会替换它自己的排序顺序

以上是关于对支持 CoreData 的 NSArrayController 进行排序时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

coredata

尽管匹配 x-coredata id,但“CoreData 不支持持久的跨存储关系”

如何将 CoreData SQLite 支持的持久存储克隆到“内存中”?

如何将 Core Data 与 ODBC 数据源一起使用?

SwiftUI 生命周期不支持 CoreData

CoreData + CloudKit 支持的 App 在导出(export)新建托管对象时内存飙升导致被杀死的解决