FetchedResultsController 中没有部分

Posted

技术标签:

【中文标题】FetchedResultsController 中没有部分【英文标题】:no sections in FetchedResultController 【发布时间】:2014-07-15 09:47:51 【问题描述】:

我插入并保存托管对象:

  MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
  NSManagedObjectContext *context = [appDelegate managedObjectContext];

  MyCity* city = (MyCity*)[NSEntityDescription insertNewObjectForEntityForName:@"City" inManagedObjectContext:context];
  city.cityId = dict[@"id"];
  city.cityName = dict[@"name"];

  NSError *error;
  if (![context save:&error]) 
    NSLog(@"error: %@", [error localizedDescription]);
  

我执行 FRC 请求:

  _fetchedResultsController = nil;
  if (![[self fetchedResultsController] performFetch:&error]) 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  

这是我的 FRC:

  if (_fetchedResultsController != nil) 
    return _fetchedResultsController;
  

  MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
  NSManagedObjectContext *context = [appDelegate managedObjectContext];

  NSEntityDescription *entity = [NSEntityDescription entityForName:@"City"
                                          inManagedObjectContext: context];
  NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"cityName" ascending:YES];
  NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, nil];

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  [fetchRequest setEntity:entity];
  [fetchRequest setSortDescriptors:sortDescriptors];
  [fetchRequest setFetchBatchSize:10];

  NSFetchedResultsController *theFetchedResultsController =
  [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:context
                                      sectionNameKeyPath: @"cityName"
                                               cacheName: @"cache"];
  [self setFetchedResultsController: theFetchedResultsController];
  _fetchedResultsController.delegate = self;

  return _fetchedResultsController;

performFetch 之后我明白了:

_fetchedResultsController.fetchedObjects //array of MyCity objects
_fetchedResultsController.sections //empty array

为什么 _fetchedResultsController.sections 是空的?

当我不使用 [context save:&error] 时,我可以在 _fetchedResultsController.sections 中看到对象数组。

在我的代码中保存上下文有问题吗?我应该如何保存 nsmanagedobject 和 nsmanagedcontext ?

【问题讨论】:

【参考方案1】:

可能dict 是空的,所以cityName 是空的并且没有节标题。

此外,您应该持有对托管对象上下文的引用,而不是反复访问您的应用委托来获取它。

我还建议在不使用 fetchBatchSize 和使用 cache:nil 的情况下测试您的代码,然后再进行优化。

另请注意,通常的模式是在您在返回 FRC 之前延迟创建 FRC 时进行提取。然后,您可以使用nil 生成提取,或在现有实例上调用performFetch

【讨论】:

以上是关于FetchedResultsController 中没有部分的主要内容,如果未能解决你的问题,请参考以下文章

FetchedResultsController 中没有部分

如何将对象从 fetchedResultsController 到 Plist?

fetchedResultsController 对象的表视图部分

fetchedResultsController 和 Integer

将 fetchedResultsController 更改为 protected from private

将 fetchedResultsController 与 swift3 一起使用