在调用初始ViewController ViewDidLoad时,CoreData和NSUserDefaults是否始终加载?

时间:2016-03-01 09:09:35

标签: ios swift core-data nsuserdefaults

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

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

  1. 用户对象存在,存储在CoreData中。我在NSUserDefaults中存储了对此用户的引用,我用它来获取CoreData对象。
  2. auth密钥存在,存储在Lockbox

    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
    }
    

2 个答案:

答案 0 :(得分:1)

此问题原来是由旧版本的Lockbox(1.4.x)引起的。升级到v3修复了问题。

感谢所有回复。

答案 1 :(得分:0)

每次初始化时都会初始化核心数据。绝对没有魔力,初始化是由你的代码完成的。如果您正在使用Xcode项目模板中的代码,则会在您的app委托类中发生,并且在您第一次访问托管对象上下文时会自动发生。如果您使用自己的代码,那么无论何时代码运行,都会发生这种情况。

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