【发布时间】:2016-12-13 02:11:29
【问题描述】:
我正在使用 Xcode 8 和 Swift 2.3 并尝试调试我在将一些默认数据插入持久存储时遇到的核心数据问题。我正在从一本 Core Data 书籍中学习,并且在我的头上
这个函数正在检查我们是否需要导入默认数据(相信我,我们确实需要),然后在必要时进行设置:
func checkIfDefaultDataNeedsSetup (url:NSURL, type:String) {
if isDefaultDataAlreadySetupForStoreWithURL(url, type: type) == false {
if let lift = NSEntityDescription.entityForName("Lift", inManagedObjectContext: CDHelper.shared.context) { /*breakpoint*/ 1
// not returning here
let newLiftEvent = Lift(entity: lift, insertIntoManagedObjectContext: CDHelper.shared.context)
newLiftEvent.uid = 0
newLiftEvent.liftName = "Back Squat"
CDHelper.saveSharedContext()
} else {
// skip setup
}
return
}
在断点 1 它调用 CDHelper.shared.context(inManagedObjectContext 参数),我让它在断点 2 和 3 处停止:
private let _sharedCDHelper = CDHelper() /* breakpoint 3 */
class CDHelper : NSObject {
// MARK: - SHARED INSTANCE
class var shared : CDHelper {
return _sharedCDHelper /* breakpoint 2 */
}
当在断点 3 处停止时,只要单击 Step Into,我就会得到:
我希望它在断点 1 之后返回到下一行,在那里它开始获取CDHelper.shared.context,但它没有。 Xcode 和模拟器没有挂断或任何东西。它只是到达这一点并停留在那里,就好像它在等待什么一样。
我猜这个可选绑定 if let lift = NSEntityDescription.entityForName("Lift", inManagedObjectContext: CDHelper.shared.context) 没有被分配,所以它不会进入方法。但我可以确定 Lift 实体在 managedObjectContext 中。我在我的.xcdatamodeld 中看到它,我使用 DB for SQLite 查看了数据库,我什至删除了数据模型并重新创建了它。我还确保我只使用.MainQueueConcurrencyType。
是否存在任何人都可以看到的明显问题或者我应该寻找其他东西?也许我可以采取其他措施来确保 Lift 实体像我认为的那样位于托管对象上下文中?
【问题讨论】:
标签: swift core-data nsmanagedobjectcontext