【问题标题】:Will CoreData and NSUserDefaults have always loaded by the time the initial ViewController ViewDidLoad is called?在调用初始 ViewController ViewDidLoad 时,CoreData 和 NSUserDefaults 会一直加载吗?
【发布时间】:2016-03-01 09:09:34
【问题描述】:

在应用启动时,如果用户在设备上已有凭据,我会尝试自动登录。在我的测试中,我偶尔会观察到应该成功的自动登录失败。是否有可能在 CoreData 完全初始化之前调用 ViewDidLoad?

要检查自动登录,我检查:

  1. 用户对象存在,存储在 CoreData 中。我将对该用户的引用存储在 NSUserDefaults 中,用于获取 CoreData 对象。
  2. 验证密钥存在,存储在密码箱中

    override func viewDidLoad() {
            super.viewDidLoad()
    
              if self.findUser() != nil && self.getAuthToken() != nil {
                  self.autoLogIn()
              }else{
                  self.showLogInScreen()
              }
    }
    
    func findUser() -> User? {
    
            let objectURL = NSUserDefaults.standardUserDefaults().URLForKey("userURI")
             if (objectURL == nil) {
                 Debug().printString("objectURL == nil")
                 return nil
             }
    
    
             let objectID = self.managedObjectContext?.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(objectURL!)
             if objectID == nil {
                 Debug().printString("objectID == nil")
                 return nil
             }
    
             var currentUser: NSManagedObject?
             do {
                 currentUser = try self.managedObjectContext?.existingObjectWithID(objectID!)
             } catch let error1 as NSError {
                 currentUser = nil
                 Debug().printString("error1.localizedDescription")
             }
    
            return currentUser as? User
    }
    
    func getAuthToken() -> String? {
        let authToken = Lockbox.stringForKey("authToken")
        return authToken
    }
    

【问题讨论】:

  • Core Data 栈是延迟初始化的,这意味着在第一次访问时
  • 您好,您可以在访问应用程序的任何地方调用 nsuserdefault 或 coredata。因为它将数据保存到应用程序数据库中
  • NSPersistentStore 添加到NSPersistentStoreCoordinator 可能会花费不可预测的时间,从而完全初始化Core Data 堆栈。如果您的第一个任务依赖于 Core Data,而不是在添加 Store 并执行任务时进行回调。

标签: ios swift core-data nsuserdefaults


【解决方案1】:

这个问题原来是由旧版本的密码箱 (1.4.x) 引起的。升级到 v3 解决了这个问题。

感谢所有回复。

【讨论】:

    【解决方案2】:

    每当您初始化核心数据时,都会对其进行初始化。它绝对没有魔法,初始化是由您的代码完成的。如果您使用 Xcode 项目模板中的代码,这会发生在您的应用委托类中,并且会在您第一次访问托管对象上下文时自动发生。如果您使用自己的代码,那么很明显,只要您的代码运行,就会发生这种情况。

    NSUserDefaults 不需要初始化。如果您的代码正在运行,则用户默认值可用。你不需要做任何事情来准备它,它就在你面前。

    【讨论】:

    • 我明白了,谢谢。是的,我的 CoreData 在启动时加载到 AppDelegate 中。我想我的问题一定是其他问题,但目前我正在努力寻找可能的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多