如何解决:为啥核心数据(NSFetchedResultsController)在 iOS5 和 iOS 4 中排序不同

Posted

技术标签:

【中文标题】如何解决:为啥核心数据(NSFetchedResultsController)在 iOS5 和 iOS 4 中排序不同【英文标题】:How to solve: Why is coreData(NSFetchedResultsController) sorting differently in iOS5 and iOS4如何解决:为什么核心数据(NSFetchedResultsController)在 iOS5 和 iOS 4 中排序不同 【发布时间】:2012-07-10 08:54:13 【问题描述】:

我有一个用 NSFetchedResultsController 填充的 tableview。 在didSelectRowAtIndexPath我正在更新当前的row。这里的排序不应该改变。所选行的不同之处在于,我将其标记为已读。没有标题更改或其他内容。

ios4 中,该行被更新并仍然留在他当前的位置,它不会移动到部分的末尾。那是正确的方法。

在 iOS5 中,该行也会更新,但会移动到该部分的末尾。我想阻止这种情况。我怎样才能做到这一点?为什么会这样?

查看我的代码:

- (NSFetchedResultsController *)fetchedResultsController

if (__fetchedResultsController != nil)

    return __fetchedResultsController;



NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntitySetsCardsInbox" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSPredicate *inboxPred = [NSPredicate predicateWithFormat:@"archived == 0 AND cardId != 0"];
[fetchRequest setPredicate:inboxPred];


if (sortString == nil) 
    //sortString = [[NSString alloc] initWithString:@"sortingOrder"];
    sortString = [[NSString alloc] initWithString:@"colorOrder"];
    sortAsc = NO;



if ([sortString isEqualToString:@"cardTitle"]) 
    NSSortDescriptor *sortDescriptor2 = [[[NSSortDescriptor alloc] initWithKey:sortString ascending:sortAsc selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor2, nil] autorelease];
    [fetchRequest setSortDescriptors:sortDescriptors];

    XLog(@"sortDescriptors: %@", sortDescriptors);
 else 
    NSSortDescriptor *sortDescriptor2 = [[[NSSortDescriptor alloc] initWithKey:sortString ascending:sortAsc] autorelease];
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor2, nil] autorelease];
    [fetchRequest setSortDescriptors:sortDescriptors];

    XLog(@"sortDescriptors: %@", sortDescriptors);



NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

    [...]
    

【问题讨论】:

【参考方案1】:

我认为当你更新你的行时你的排序描述符正在改变。再添加一个 sortdescriptor 来修复列表并再次检查。就我而言,我有一个非常相似的问题,它解决了我的问题。也许你的也是。

【讨论】:

以上是关于如何解决:为啥核心数据(NSFetchedResultsController)在 iOS5 和 iOS 4 中排序不同的主要内容,如果未能解决你的问题,请参考以下文章

究竟啥是核心文件,它为啥有用?

iPhone 4 iOS 5 NSFetchedResultsController 如何选择批量大小?

为啥 Spark 每个执行器只使用一个核心?它如何决定使用分区数量以外的核心?

为啥我的核心数据没有更新?

为啥Mono问题,怎么解决

为啥我得到分段(核心转储)?