RestKit和fetchedResultsController performFetch成功但fetchedObjects为空

时间:2013-07-25 00:18:04

标签: ios core-data restkit

我有一个UIViewController,它从Web服务中获取JSON数据并将其映射到一个对象(称为Post)。在我的viewDidLoad中,我能够从self.fetchedResultsController.fetchedObjects获取此数据。我的问题是我试图在子视图控制器中执行相同的操作,而fetchedResultsController performFetch不会产生错误,但fetchedObjects为空。

我像这样传递managedObjectContext:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [super prepareForSegue:segue sender:sender];

    if ([segue.identifier isEqualToString:@"PostsList"] == YES) {
        PostViewController *postsController = [segue destinationViewController];
        postsController.managedObjectContext = self.managedObjectContext;
    }
}

在我的故事板中,我使用PostsList作为标识符进行了嵌入segue。在我的viewDidLoad中,我有以下内容:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[RKObjectManager sharedManager] getObjectsAtPath:@"/flog/post" parameters:nil    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        NSLog(@"Fetched count %d",[self.fetchedResultsController.fetchedObjects count]);
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"fail!");
    }]; 
}

我的fetchedResultsController看起来像:

- (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }
    NSLog(@"The managedObjectContext %@", self.managedObjectContext);
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setFetchBatchSize:20];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created" ascending:NO];
    NSArray *sortDescriptors = @[sortDescriptor];

    [fetchRequest setSortDescriptors:sortDescriptors];
    NSLog(@"fetchRequest appears ok %@", fetchRequest );

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

    NSLog(@"The fetchedResultsController %@", aFetchedResultsController );
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

    NSLog(@"post fetched %@", self.fetchedResultsController.fetchedObjects );
    return _fetchedResultsController;
}

我已将行为与父控制器进行比较,但看不出任何差异。任何帮助或调试技巧将不胜感激。谢谢你的阅读。

2 个答案:

答案 0 :(得分:0)

如果FRC正在工作(我认为即使您没有显示日志输出),接下来要检查的是显示逻辑。

确保表视图数据源方法正确显示获取的对象。

如果您在FRC中获得0结果,请尝试将cacheName设置为nil。如果仍然没有记录,请检查实际的数据库。您可以在

这样的位置找到Simulator数据库
~/Library/Application\ Support/iPhone\ Simulator/6.1/Applications/
   <app-specific-sha>/Documents/

然后,您可以使用sqlite3命令行工具检查Post个实体。

答案 1 :(得分:0)

我认为问题源于这个类似的问题iOS - viewDidLoad is being called BEFORE the didFinishLaunchingWithOptions delegate?

我最初在做

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.fetchedResultsController.fetchedObjects count];
}

我相信这是在检索任何JSON数据之前调用的。我将其更改为返回_postCount,并将其设置为fetchedResultsController函数的末尾。这现在正在工作,在控制台中我可以看到在self.fetchedResultsController performFetch之前引入了JSON。

总之,我的问题是在JSON数据进入之前触发了performFetch。我不认为我的解决方案是最好的,因为它只是一个解决方法所以如果有人可以解释如何处理/防止此加载顺序问题我将其标记为正确答案。欢呼声。