RestKit 和 fetchedResultsController performFetch 成功但 fetchedObjects 为空

Posted

技术标签:

【中文标题】RestKit 和 fetchedResultsController performFetch 成功但 fetchedObjects 为空【英文标题】:RestKit and fetchedResultsController performFetch is successful but fetchedObjects is empty 【发布时间】:2013-07-25 00:18:03 【问题描述】:

我有一个 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;

我已经将行为与父控制器进行了比较,看不出有任何区别。任何帮助或调试提示将不胜感激。感谢阅读。

【问题讨论】:

【参考方案1】:

如果 FRC 工作正常(我假设它工作正常,即使你没有显示日志输出),接下来你要检查的是你的显示逻辑。

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

如果您在 FRC 中得到 0 个结果,请尝试将 cacheName 设置为 nil。如果仍然没有记录,请检查实际数据库。您会在类似的位置找到模拟器数据库

~/Library/Application\ Support/iPhone\ Simulator/6.1/Applications/
   <app-specific-sha>/Documents/

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

【讨论】:

我不相信我能够显示任何内容,因为 fetchedObjects 计数为 0,我将其用作 numberOfRowsInSection 中的返回值。如果我将返回值更改为随机整数,那么它将显示行但具有一些默认内容。【参考方案2】:

我相信这个问题源于这个类似的问题ios - viewDidLoad is being called BEFORE the didFinishLaunchingWithOptions delegate?

我原来在做

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return [self.fetchedResultsController.fetchedObjects count];

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

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

【讨论】:

以上是关于RestKit 和 fetchedResultsController performFetch 成功但 fetchedObjects 为空的主要内容,如果未能解决你的问题,请参考以下文章

使用多个基本 URL 和多个对象管理器 (RestKit)

RestKit 和 AFNetworking 构建错误

RestKit 和拉动刷新

我可以使用 RestKit 和 Realm.io 吗?

一起使用 Realm.io 和 RestKit 时的属性数据类型

RESTKit:BaseURL 和路径模式