Swift iOS 12错误:似乎来自与此上下文不同的NSManagedObjectModel';s

Swift iOS 12错误:似乎来自与此上下文不同的NSManagedObjectModel';s,swift,core-data,ios12,Swift,Core Data,Ios12,在iOS 12模拟器上启动应用程序时,我开始出现以下错误。有人面临过这样的问题吗 2018-08-11 21:17:44.440144+0300 CafeManager[4633:128874] [error] error: The fetch request's entity 0x600001f6e940 'TablesTable' appears to be from a different NSManagedObjectModel than this context's 我在AppDel

在iOS 12模拟器上启动应用程序时,我开始出现以下错误。有人面临过这样的问题吗

2018-08-11 21:17:44.440144+0300 CafeManager[4633:128874] [error] error: The fetch request's entity 0x600001f6e940 'TablesTable' appears to be from a different NSManagedObjectModel than this context's
我在AppDelegate中定义了全局常量:

let viewContext = AppDelegate.viewContext
并将其与NSFetchedResultsControl一起使用,以进行UITableView更新,例如:

import UIKit
import CoreData

class HistoryTablesTableViewController: FetchedResultsTableViewController {
    //MARK: variables
    private var fetchedResultsController: NSFetchedResultsController<TablesTable>?
    private var currentTable: TablesTable?
    private var tableNameTextField: UITextField!

    //MARK: system functions for view
    override func viewDidLoad() {
        super.viewDidLoad()
        sideMenu()
        addSyncObserver()
    }
    override func viewWillAppear(_ animated: Bool) {
        updateGUI()
    }

    // MARK: IBOutlets
    @IBOutlet weak var menuButton: UIBarButtonItem!

    // MARK: side menu
    private func sideMenu() {
        if revealViewController() != nil {
            menuButton.target = revealViewController()
            menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
            revealViewController().rearViewRevealWidth = 260

            view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
        }
    }

    //MARK: functions for table update
    private func updateGUI () {
        let request : NSFetchRequest<TablesTable> = TablesTable.fetchRequest()
        request.sortDescriptors = [NSSortDescriptor(key: "tableName", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))]
        fetchedResultsController = NSFetchedResultsController<TablesTable>(fetchRequest: request, managedObjectContext: viewContext, sectionNameKeyPath: nil, cacheName: nil)
        try? fetchedResultsController?.performFetch()
        tableView.reloadData()
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath) as! HistoryTablesTableViewCell
        if let tablesTable = fetchedResultsController?.object(at: indexPath) {
            cell.tableNameLabel.text = tablesTable.tableName
            cell.cellDelegate = self
            cell.table = tablesTable
        }
        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath as IndexPath)
        tableView.deselectRow(at: indexPath as IndexPath, animated: true)
        currentTable = fetchedResultsController?.object(at: indexPath)
        performSegue(withIdentifier: "showTableSessions", sender: cell)
    }

    //MARK: prepare for segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showTableSessions" {
            if let tableSessionsTVC = segue.destination as? TableSessionsTableViewController {
                tableSessionsTVC.title = self.currentTable!.tableName!
                tableSessionsTVC.currentTable = self.currentTable!
            }
        }
    }
}

// MARK: Delegates
extension HistoryTablesTableViewController: HistoryTablesTableViewCellDelegate {
    func didPressTablesCellButton(table: TablesTable) {
        currentTable = table
    }
}

// Common extension for fetchedResultsController
extension HistoryTablesTableViewController {
    override func numberOfSections(in tableView: UITableView) -> Int {
        return fetchedResultsController?.sections?.count ?? 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let sections = fetchedResultsController?.sections, sections.count > 0 {
            return sections[section].numberOfObjects
        }
        else {
            return 0
        }
    }

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if let sections = fetchedResultsController?.sections, sections.count > 0 {
            return sections[section].name
        }
        else {
            return nil
        }
    }

    override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
        return fetchedResultsController?.sectionIndexTitles
    }

    override func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
        return fetchedResultsController?.section(forSectionIndexTitle: title, at: index) ?? 0
    }
}

// Observer to check that sync was performed to update GUI
extension HistoryTablesTableViewController {
    private func addSyncObserver () {
        NotificationCenter.default.addObserver(forName: Notification.Name(rawValue: appDelegate.syncDidFinishNotification), object: nil, queue: nil) {
            [weak self] notification in
            DispatchQueue.main.async {
                self?.updateGUI()
            }
        }
    }
}
导入UIKit
导入CoreData
类HistoryTableViewController:FetchedResultsTableViewController{
//马克:变量
私有变量fetchedResultsController:NSFetchedResultsController?
私有变量currentTable:TablesTable?
私有变量tableNameTextField:UITextField!
//标记:用于查看的系统功能
重写func viewDidLoad(){
super.viewDidLoad()
侧菜单()
addSyncObserver()
}
覆盖函数视图将出现(uo动画:Bool){
updateGUI()
}
//马克:Ibouts
@IBVar menuButton:UIBarButtonItem!
//马克:侧菜单
专用func侧菜单(){
如果revealViewController()!=nil{
menuButton.target=Revalviewcontroller()
menuButton.action=#选择器(SWRevealViewController.revealToggle(:))
RevalViewController().RearViewRevalWidth=260
view.AddGestureRecognitizer(self.RevelveViewController().PangestureRecognitizer())
}
}
//标记:用于表更新的函数
私有函数更新GUI(){
let请求:NSFetchRequest=tabletable.fetchRequest()
request.sortDescriptors=[NSSortDescriptor(键:“tableName”,升序:true,选择器:#选择器(NSString.localizedStandardCompare(:)))]
fetchedResultsController=NSFetchedResultsController(fetchRequest:request,managedObjectContext:viewContext,sectionNameKeyPath:nil,cacheName:nil)
尝试?获取结果控制器?.performFetch()
tableView.reloadData()
}
重写func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
将cell=tableView.dequeueReusableCell(标识符为:“tableCell”,for:indexath)设为!HistoryTablesTableViewCell
如果let tableTable=fetchedResultsController?.object(位于:indexPath){
cell.tablenamelab.text=tabletable.tableName
cell.cellDelegate=self
cell.table=tableTable
}
返回单元
}
重写func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
让cell=tableView.cellForRow(at:indexPath作为indexPath)
取消选择行(at:indepath作为indepath,动画:true)
currentTable=fetchedResultsController?对象(位于:indexPath)
PerformScheue(标识符为“showTableSessions”,发送方:单元格)
}
//马克:准备赛格
覆盖功能准备(对于segue:UIStoryboardSegue,发送方:有吗?){
如果segue.identifier==“showTableSessions”{
如果让tableSessionsTVC=segue.destination作为?TableSessionsTableViewController{
tableSessionsTVC.title=self.currentTable!.tableName!
tableSessionsTVC.currentTable=self.currentTable!
}
}
}
}
//马克:各位代表
扩展HistoryTableViewController:HistoryTableViewCellDelegate{
func didPressTablesCellButton(表:TablesTable){
当前表格=表格
}
}
//fetchedResultsController的公共扩展
扩展HistoryTableViewController{
重写func numberOfSections(在tableView:UITableView中)->Int{
返回获取的ResultsController?.sections?.count?1
}
重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
如果let sections=fetchedResultsController?.sections,sections.count>0{
返回节[section]。numberOfObjects
}
否则{
返回0
}
}
重写func tableView(tableView:UITableView,titleForHeaderInSection:Int)->String{
如果let sections=fetchedResultsController?.sections,sections.count>0{
返回节[section].name
}
否则{
归零
}
}
覆盖func sectionIndexTitles(对于tableView:UITableView)->[String]{
返回获取的ResultsController?.sectionIndexTitles
}
重写func tableView(tableView:UITableView,sectionForSectionIndexTitle:String,at index:Int)->Int{
返回fetchedResultsController?节(forSectionIndexTitle:title,at:index)??0
}
}
//观察员检查是否执行了同步以更新GUI
扩展HistoryTableViewController{
私有函数addSyncObserver(){
NotificationCenter.default.addObserver(forName:Notification.Name(rawValue:appDelegate.syncDidFinishNotification),对象:nil,队列:nil){
中的[弱自我]通知
DispatchQueue.main.async{
self?.updateGUI()
}
}
}
}
同时,看起来该应用程序可以正常工作,但还没有机会对所有内容进行正确测试

我使用CoreData,Seam3框架


我在上找到了唯一一个提到此错误的地方,但没有看到解决方案。

我在iOS 12上也遇到了此错误。这就是我最终在我的项目中修复它的方式。这是目标C,不是Swift,但希望它能让你朝着正确的方向前进

产生此错误的代码如下所示

// in the init code for my object
NSString *pathm = [[NSBundle mainBundle] pathForResource:@"mycoredb" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:pathm];
self.model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];


// in another method in the object
NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [[self.model entitiesByName] objectForKey:@"Model_name"];
[request setEntity:entity];
这个问题与实体有关。因此,我更新了代码以反映本页上的示例:

下面是我的代码现在的样子

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Model_name"];

“似乎来自与此上下文不同的NSManagedObjectModel”错误。

当我们创建模型的两个实例时,我遇到了类似的情况,即使它们是从相同的
momd
文件读取的。我的假设是,如果它是从同一个文件中读取的,它们应该是同一个模型,但我猜在这个过程中发生了一些变化
var mainManagedContext: NSManagedObjectContext {
    return persistentContainer.viewContext
}

lazy var backgroundQueueContext: NSManagedObjectContext = {
    let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
    context.parent = mainManagedContext
    return context
}()

lazy var mainQueueContext: NSManagedObjectContext = {
    let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    context.parent = mainManagedContext
    return context
}()

lazy var alternativeContext: NSManagedObjectContext = {
    let context = persistentContainer.newBackgroundContext()
    return context
}()