Core data 如何在swift中使用NSFetchedResultsController处理多个实体

Core data 如何在swift中使用NSFetchedResultsController处理多个实体,core-data,swift3,Core Data,Swift3,我有3个类似的表,我想存储在核心数据中。我想使用NSFetchedResultsController从公共视图控制器查看和编辑表。如何概括设置或使用子分类来实现这一点?下面是我代码中的示例 推荐 是实体之一。我有另一个实体名为 结果 我希望使用它(通过更改表中的单元格描述)并进行适当的其他更改。例如,如何使用变量表示推荐 var moc:NSManagedObjectContext! var fetchedResultsController: NSFetchedResultsController

我有3个类似的表,我想存储在核心数据中。我想使用NSFetchedResultsController从公共视图控制器查看和编辑表。如何概括设置或使用子分类来实现这一点?下面是我代码中的示例

推荐

是实体之一。我有另一个实体名为

结果

我希望使用它(通过更改表中的单元格描述)并进行适当的其他更改。例如,如何使用变量表示推荐

var moc:NSManagedObjectContext!
var fetchedResultsController: NSFetchedResultsController<Recommendation>!
var recommendations: [Recommendation] = []
var-moc:NSManagedObjectContext!
var fetchedResultsController:NSFetchedResultsController!
风险值建议:[建议]=[]
以及一种方法:

    func setupFetchedResultsController() {
    let dataRequest:NSFetchRequest<Recommendation> = Recommendation.fetchRequest()
    let sortDescriptor = NSSortDescriptor(key:"recordNumber", ascending: true)
    dataRequest.sortDescriptors = [sortDescriptor]

    fetchedResultsController = NSFetchedResultsController(fetchRequest: dataRequest, managedObjectContext: moc, sectionNameKeyPath: #keyPath(Recommendation.recordNumber), cacheName: nil)
    fetchedResultsController.delegate = self
    do {
        try fetchedResultsController.performFetch()
    } catch {
        print(error.localizedDescription)
    }
}
func setupFetchedResultsController(){
let dataRequest:NSFetchRequest=Recommendation.fetchRequest()
让sortDescriptor=NSSortDescriptor(键:“recordNumber”,升序:true)
dataRequest.sortDescriptors=[sortDescriptor]
fetchedResultsController=NSFetchedResultsController(fetchRequest:dataRequest,managedObjectContext:moc,sectionNameKeyPath:#keyPath(Recommension.recordNumber),cacheName:nil)
fetchedResultsController.delegate=self
做{
请尝试fetchedResultsController.performFetch()
}抓住{
打印(错误。本地化描述)
}
}

您可以创建具有要覆盖的属性的基本表视图控制器。我建议像核心数据模板中建议的那样延迟初始化fetch控制器

class BaseTableViewController: UITableViewController {

    var managedObjectContext : NSManagedObjectContext!

    // MARK: - Variables to be overridden

    var entity : String { fatalError("entity must be overridden") }
    var sortDescriptors : [NSSortDescriptor]? { return nil }
    var cacheName : String? { return nil }
    var sectionNameKeyPath : String? { return nil }
    var fetchPredicate : NSPredicate? {
        didSet {
            fetchedResultsController.fetchRequest.predicate = fetchPredicate
        }
    }

   ...

    lazy var fetchedResultsController: NSFetchedResultsController<NSFetchRequestResult> = {

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: self.entity)
        fetchRequest.predicate = self.fetchPredicate

        fetchRequest.sortDescriptors = self.sortDescriptors
        let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,
                                                               managedObjectContext: self.managedObjectContext!,
                                                               sectionNameKeyPath: self.sectionNameKeyPath,
                                                               cacheName: self.cacheName)
        aFetchedResultsController.delegate = self

        do {
            try aFetchedResultsController.performFetch()
        } catch let error as NSError {
            self.present(error:error)
        }

        return aFetchedResultsController
    }()

   ...

}

谢谢你的回答。我需要从子类中填充单元格,所以我在基类中创建了一个我重写的函数。在cellForRowAt的基类中,我的代码为:let dataObject=fetchedResultsController.object(at:indexPath);fillCell(单元格:cell1,数据对象:dataObject);当我重写fillCell时,我需要做什么将dataObject强制转换到实体以便访问属性?我需要模仿:cell1.categorylabel.text=dataObject.categoryI确实找到了答案。我将其转换为let d=dataObject as!然后,建议d公开所有属性。谢谢你的帮助。
class RecommendationViewController: BaseTableViewController {

  // MARK: - Variables to overide

  override var entity : String { return "Recommendation" }
  override var sectionNameKeyPath : String? { return #keyPath(Recommendation.recordNumber) }
  override var sortDescriptors : [NSSortDescriptor]? { return [NSSortDescriptor(key:"recordNumber", ascending: true)] }