1

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

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

4

2 回答 2

0

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

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

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

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

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

于 2013-07-25T06:50:34.267 回答
0

我相信这个问题源于这个类似的问题iOS - viewDidLoad 在 didFinishLaunchingWithOptions 委托之前被调用?

我原本在做

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

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

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

于 2013-07-26T01:11:54.443 回答