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 为空的主要内容,如果未能解决你的问题,请参考以下文章