【问题标题】:Data content changes when Coredata didsavenotification is received收到 Coredata didsavenotification 时数据内容发生变化
【发布时间】:2016-04-07 10:41:33
【问题描述】:

我遇到了一个可怕的问题。我正在使用我的主 MOC 将带有字段 sync 的 managedObject "Customer" 保存为 false。然后在与服务器同步后,我使用私有 MOC 将 Customersync 字段保存为 true。当我保存它时,通知会通过,主 MOC 会正确保存客户。然后,当我编辑该客户时,会发生相同的过程。但是这一次,即使 sync 字段是true,直到私有 MOC 保存它,另一端收到的通知包含 Customer同步false。如果我重复这个过程,sync 会变成true。如果我使用私有 MOC 保存一些其他数据,而不是重复,那么通过该通知,Customer 还带有 sync 字段作为true。我不明白为什么通知方法不能正常工作。在 didsavenotification 的 addObserver 中,我已将 object 指定为私有 MOC 本身。有人请帮忙。 这些是此流程中突出的代码 sn-ps。

//赋值为假

selectedCustomer.synced = NSNumber(bool: false)

//使用主MOC保存

try managedObjectContext.save()

//将同步的详细信息分配给字典

let cust: CustomerDetails = CustomerDetails(data: customer) cust.synced = true

//将字典分配给使用私有MOC从coredata获取的客户managedObject

assignData(customerDetails, toCustomer: customer)

//保存私有MOC

try syncManagedObjectContext.save()

//获取通知并保存

managedObjectContext.performBlock { () -> Void in self.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification) }

//注册通知

let notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.addObserver(self, selector: #selector(AppDelegate.managedObjectContextDidSave(_:)), name: NSManagedObjectContextDidSaveNotification, object: syncManagedObjectContext)

编辑:

这些是我正在使用的 MOC 的定义

lazy var managedObjectContext: NSManagedObjectContext = {
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    managedObjectContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

lazy var syncManagedObjectContext: NSManagedObjectContext = {
    let coordinator = self.managedObjectContext.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
    managedObjectContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

【问题讨论】:

  • 可能需要显示有关如何保存两次的代码

标签: ios swift core-data nsnotificationcenter


【解决方案1】:

同时展示您是如何定义 MOC 的。

他们是亲子吗?

他们是反对NSPersistentStoreCoordinator 的兄弟姐妹吗?

这可能会产生影响。

我还会打开 -com.apple.CoreData.ConcurrencyDebug 1 并再次运行您的应用,因为这听起来像是线程问题。

更新 1

由于您的 NSManagedObjectContext 实例是同级实例,您确实需要打开货币调试标志并再次运行。这真的读起来像一个线程问题。

更新 2

如果这不是线程问题,您的问题中没有很多代码可以尝试推断答案。

我的下一个建议是将您的私有 MOC 从同级移动到子级(Apple 关于线程的文档对此进行了讨论)并停止使用通知(对于子 MOC 来说是不必要的)。

如果问题仍然存在,那么您将需要在调试器中对其进行跟踪,并找出问题出现的时间点。它仍然可能是一个线程问题,而不是“在错误的线程上触摸了错误的对象”问题。当你认为它正在改变时,属性是否正在改变?使用调试器是唯一确定的方法。

【讨论】:

  • 我尝试使用并发调试标志运行,发现我的代码中有许多缺陷。谢谢:-) 但是我在这个问题中指出的问题仍然存在。现在没有其他错误出现。能否请您给我一些很好的参考来研究这个兄弟姐妹、多线程和通知方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
相关资源
最近更新 更多