【发布时间】:2016-03-01 09:09:34
【问题描述】:
在应用启动时,如果用户在设备上已有凭据,我会尝试自动登录。在我的测试中,我偶尔会观察到应该成功的自动登录失败。是否有可能在 CoreData 完全初始化之前调用 ViewDidLoad?
要检查自动登录,我检查:
- 用户对象存在,存储在 CoreData 中。我将对该用户的引用存储在 NSUserDefaults 中,用于获取 CoreData 对象。
-
验证密钥存在,存储在密码箱中
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