我正在使用Xcode 8和Swift 2.3并尝试调试我在将一些默认数据插入持久存储时遇到的核心数据问题。我正在从核心数据书中学习,并且在我的脑海中学到一点
此函数正在检查我们是否需要导入默认数据(相信我,我们这样做),然后在必要时进行设置:
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
}
在breakpoint1,它调用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和Simulator没有挂断或任何东西。它只是达到了这一点,并保持在那里,好像它在等待什么。
我猜这个可选绑定if let lift = NSEntityDescription.entityForName("Lift", inManagedObjectContext: CDHelper.shared.context)
没有被分配,所以它不会进入该方法。但我确信Lift实体位于managedObjectContext中。我在.xcdatamodeld
中看到它,我使用DB for SQLite查看了数据库,我甚至删除了数据模型并重新创建了它。我也确保我只使用.MainQueueConcurrencyType
。
有没有明显的问题,任何人都可以看到或有其他我应该寻找的东西?我可以采取其他措施来确保Lift
实体在托管对象上下文中,就像我认为的那样?
答案 0 :(得分:0)
我猜这个可选绑定
if let lift = NSEntityDescription.entityForName("Lift", inManagedObjectContext: CDHelper.shared.context)
没有被分配
为什么猜?删除或禁用所有断点并在该行上放置断点。现在运行应用程序。当我们在那个断点停下来时,跳过去。现在看看你在哪里。