NSFetchedResultsController自定义排序没有被调用
我目前正在尝试使用NSFetchedResultsController从Core Data填充项目中的UITableView。 我正在使用比较器进行自定义搜索(尽管我也尝试了一个选择器并且有相同的问题):
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
/*
Set up the fetched results controller.
*/
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"objectName" ascending:YES comparator:^(id s1, id s2) {
NSLog(@"Comparator");
//custom compare here with print statement
}];
NSLog(@"Sort Descriptor Set");
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"firstLetterOfObject" cacheName:@"Objects"];
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
if (![fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return fetchedResultsController;
当我输入这个标签时,我已经记录了整个程序,发现NSFetchedResultsController在读取时甚至不会输入比较器块。 而是用一些默认排序方法对其进行排序。
但是,如果我使用objectName删除并添加Object,则它将进入比较器块并正确排序表。
为什么NSFetchedResultsController在托管对象模型改变之前不能使用比较器进行排序?
注意:我已经试过关闭缓存,并且/或者在viewDidLoad中执行一次提取操作,但是似乎我提取多少次并不重要,但是什么时候执行。 出于某种原因,它只在对象模型更改后使用我的排序。
有几件事我能想到。 首先,虽然这可能不是你的问题,但你不能排序瞬态属性。 但更有可能的是,当在由SQL存储支持的模型中进行排序时,比较器会“编译”为SQL查询,并非所有Objective-C函数都可用。 在这种情况下,执行提取后您需要在内存中进行排序。
编辑:请参阅此文档,特别是提取谓词和排序描述符部分。
我看到同样的问题,并且解决它的一种方法是修改对象,保存更改并将其恢复到原始值并再次保存。
// try to force an update for correct initial sorting bug
NSInteger count = [self.fetchedResultsController.sections count];
if (count > 0) {
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0];
count = [sectionInfo numberOfObjects];
if (count > 0) {
NSManagedObject *obj = [self.fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
NSString *name = [obj valueForKey:@"name"];
[obj setValue:@"X" forKey:@"name"];
// Save the context.
[self saveContext];
[obj setValue:name forKey:@"name"];
// Save the context.
[self saveContext];
}
}
对不起,您是否错过了您的代码片段的最终获取部分?
NSError *error;
BOOL success = [aFetchedResultsController performFetch:&error];
不要忘记发布请求:
[fetchRequest release];
链接地址: http://www.djcxy.com/p/36173.html
上一篇: NSFetchedResultsController custom sort not getting called
下一篇: Using an NSFetchedResultsController without a UITableViewController