核心数据:使用NSFetchedResultsController获取多个实体

时间:2014-11-21 07:42:26

标签: ios objective-c core-data swift nsfetchedresultscontroller

我可以使用NSFetchedResultsController获取一个实体并使用单个部分在tableview中显示数据。但是如何使用NSFetchedResultsController获取两个或更多实体(无关系)并在不同的部分显示数据?

我注意到使用核心数据,我可以使用NSFetchedResultsController获取部分数和行数。我在NSFetchedResultsController中设置了一个实体,它很好地处理tableView,包括添加和删除行。

func getFetchedResultController() - > NSFetchedResultsController {
  fetchedResultController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
  fetchedResultController.delegate = self
  fetchedResultController.performFetch(nil)
  return fetchedResultController
}

func fetchRequest() - > NSFetchRequest {
  let fetchRequest = NSFetchRequest(entityName: "Fruits")
  let sortDescriptor = NSSortDescriptor(key: "desc", ascending: true)
  fetchRequest.sortDescriptors = [sortDescriptor]
  return fetchRequest
}

override func numberOfSectionsInTableView(tableView: UITableView) - > Int {
  let section = fetchedResultController.sections ? .count
  return section!
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) - > Int {
  if let s = fetchedResultController.sections as ? [NSFetchedResultsSectionInfo] {
    return s[section].numberOfObjects
  }
  return 0
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {
  var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
  let fruit = fetchedResultController.objectAtIndexPath(indexPath) as Fruits
  cell.textLabel.text = fruit.desc
  return cell
}

但是部分始终为零,因为它只使用一个实体。假设我想显示2个实体/表格水果和饮料(无关系),我应该将这些实体放在上面的代码中? NSFetchedResultsController可以在tableView的不同部分处理这些实体吗?

1 个答案:

答案 0 :(得分:1)

使用两个 fetchedResultsControllers,说fruitFRCdrinksFRC,然后将这些FRC报告的indexPath映射到indexPath tableView使用的。例如,如果水果要出现在tableView的第0部分中,您可以使用tableView indexPathfruitFRC中查找以获取水果详细信息。但是对于饮料,在tableView的第1部分中,您需要创建一个新的indexPath,因为drinksFRC将使用第0部分。(您可以使用indexPathForRow:inSection: NSIndexPath方法创建新的indexPath。)

同样,在numberOfRowsInSection中,如果section为0,则返回fruitFRC中的对象数,如果section为1,则返回对象数在drinksFRC

等等......