我有一个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;
}
我已将行为与父控制器进行比较,但看不出任何差异。任何帮助或调试技巧将不胜感激。谢谢你的阅读。
答案 0 :(得分:0)
如果FRC正在工作(我认为即使您没有显示日志输出),接下来要检查的是显示逻辑。
确保表视图数据源方法正确显示获取的对象。
如果您在FRC中获得0结果,请尝试将cacheName
设置为nil
。如果仍然没有记录,请检查实际的数据库。您可以在
~/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。我不认为我的解决方案是最好的,因为它只是一个解决方法所以如果有人可以解释如何处理/防止此加载顺序问题我将其标记为正确答案。欢呼声。