2017-06-06 15 views
0

我想阻止我所有的后台保存和CoreData更新当我点击我的注销按钮,这样我可以安全地删除所有与删除当前用户数据。我的代码删除CoreData对象停止保存到coredata在后台同时按一个按钮就

static func logoutAction(){ 
    SVProgressHUD.show() 
    let deviceToken = kSharedUserDefaults.getDeviceToken() 
    self.perform(#selector(deletecoreData), with: self, afterDelay: 3) 

    print("Reset All data in userddefaults.") 
    kSharedUserDefaults.setDeviceToken(token: deviceToken) 
    SVProgressHUD.dismiss() 
    kSharedAppDelegate.configureLoginViewController() 

} 

static func deletecoreData(){ 
    for str in ["JobStatusTransition","JobImages","CustomField","Attribute","Booking","Job","Notification","Person","Status"]{ 
     deleteObjEntity(entity: str) 
    } 
    if let bundle = Bundle.main.bundleIdentifier { 
     UserDefaults.standard.removePersistentDomain(forName: bundle) 
    } 
} 
    static func deleteObjEntity(entity:String){ 
    let moc = CoreDataHelper.sharedInstance.bgManagedObjectContext 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity) 

    let result = try? moc.fetch(fetchRequest) 
    let resultData = result 

    for object in resultData! { 
     moc.delete(object as! NSManagedObject) 
    } 

    do { 
     try moc.save() 
     print("saved!") 
    } catch let error as NSError { 
     print("Could not save \(error), \(error.userInfo)") 
    } catch { 

    } 
} 

目前它的时候有任何后台保存到数据库,这些都是我的错误崩溃

CoreData:错误:变异托管对象0x1951ade0(0x19558580)它有后已从其上下文中移除。 2017年6月6日16:37:32.448 WheelTech [2242:256244] CoreData:错误:突变后它已经从它的上下文移除的管理对象0x1951ade0(0x19558580)。 2017年6月6日16:37:32.465 WheelTech [2242:256244] *终止应用程序由于未捕获的异常“NSInvalidArgumentException”,原因:“非法尝试建立关系‘在不同的上下文对象之间的预订’(源=(实体:工作; ID:0x1951ade0; *第一掷调用堆栈: (0x24eb391b 0x2464ee17 0x269a2475 0x269a0fb1 0xa7c00 0xa8338 0x11bb38 0x26a0d4b7 0x1f72493 0x1f6ade1 0x1f73ecf 0x1f737cf 0x24be5b29 0x24be5718) 的libC++ abi.dylib:与类型的未捕获的异常终止NSException

+0

崩溃日志说什么?你如何创建'bgManagedObjectContext'你是否从正确的线程访问它? –

回答

0

“试图建立在不同的上下文对象之间的关系”是指向深层次问题在你是如何处理的线程和核心数据的一个严重的问题第我建议你看看这个:https://vimeo.com/89370886,它解释了一个正确设置的核心数据栈应该是什么样的。基本的想法是,你希望所有你改变核心数据在串行队列中完成。每个操作创建它自己的上下文,获取它需要的对象,修改它们,保存上下文然后丢弃它。您永远不会将managedObjects传入或传出操作。

此设置来自NSPersistentContainer之前,但NSPersistentContainer基本上是相同的设置下,所以演讲仍然有巨大的价值。所有使用performBackgroundTask完成的写入都在专用串行队列中。要使用它:

  • 从不写viewContext
  • 只写使用performBackgroundTask
  • 不要使用任何managedObjects或上下文从performBackgroundTask
  • 不要使用任何viewContext managedObject的performBackgroundTask内 - 传递的objectID,并重新获取它的上下文中。
  • 不使用newBackgroundContext - 它只是在你是不太可能遇到极少数情况下是有用的。

一旦你有一个属性设置堆栈你的问题会去跳投。您排队操作以删除所有对象。未来的所有操作都会在提取时失败并且什么也不做。

相关问题