第二次获取数据(使用相同的方法)返回null

时间:2015-04-18 09:04:02

标签: ios core-data fetch

我从核心数据中获取数据,第一次返回正确的结果。 我想再次获取它以更新获取偏移量,我使用相同的方法获取但它返回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;

}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

创建FRC时需要一些代码来检查它是否确实需要完成:

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

所以,如果它已经存在,它将被退回。因此,第二次请求FRC时,将不会进行新的提取,也不会对提取请求进行任何更改。

如果您需要它们,则需要销毁现有FRC(self.fetchedResultsController = nil;)或使用单独的方法更改获取请求。

请记住,当您更改获取请求时,您必须在FRC上调用performFetch,否则更改将被忽略。

从您的评论中,您想要滚动以加载更多,这不应该使用FRC完成。 FRC应该只是观察核心数据中的整个数据集。如果要加载更多,则应检测请求(按钮,拉动,滚动等)并在Core Data中触发新的下载/对象创建。 FRC将看到这种变化并适当地调用其委托方法。