我从核心数据中获取数据,第一次返回正确的结果。 我想再次获取它以更新获取偏移量,我使用相同的方法获取但它返回null
这是我的代码
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = delegate.managedObjectContext;
ChatInfo *chat = [ChatInfo getInstance];
fetchRequest.entity = [NSEntityDescription entityForName:@"AudioHistory" inManagedObjectContext:context];
// fectch max date first
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(uploadedby == %@ && sentto == %@) || (uploadedby == %@ && sentto == %@)", chat.userid, chat.friendid, chat.friendid, chat.userid];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"ms_createdAt" ascending:YES]];
NSFetchedResultsController *firstFetchedResult =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:context sectionNameKeyPath:nil
cacheName:nil];
NSError *error = nil;
NSArray *objects = [context executeFetchRequest:fetchRequest error:&error];
if (objects.count >= 10) {
[fetchRequest setFetchOffset:objects.count-10];
}
//self.fetchedResultsController = theFetchedResultsController;
self.fetchedResultsController = firstFetchedResult;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
我做错了什么?
答案 0 :(得分:0)
创建FRC时需要一些代码来检查它是否确实需要完成:
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
所以,如果它已经存在,它将被退回。因此,第二次请求FRC时,将不会进行新的提取,也不会对提取请求进行任何更改。
如果您需要它们,则需要销毁现有FRC(self.fetchedResultsController = nil;
)或使用单独的方法更改获取请求。
请记住,当您更改获取请求时,您必须在FRC上调用performFetch
,否则更改将被忽略。
从您的评论中,您想要滚动以加载更多,这不应该使用FRC完成。 FRC应该只是观察核心数据中的整个数据集。如果要加载更多,则应检测请求(按钮,拉动,滚动等)并在Core Data中触发新的下载/对象创建。 FRC将看到这种变化并适当地调用其委托方法。