我已经很短时间进行快速编码,并希望创建我的第一个正确完成的应用程序。我的应用程序从UITabController开始(在我实现的登录部分之后)将带有“配置文件”页面,用户可以在其中更新有关自己的信息(用户名等)。
因此,我创建了一个User类,用于保存此信息,并在将来与服务器进行通信以更新用户信息。
我只希望在整个应用程序中实例化一个User类对象(但仍然可以在任何地方访问),因为只有一个用户可以在电话上登录,这样做的最佳实践是什么?值得注意的是,“登录”部分会记住用户已登录,因此他们不必重新登录(使用isLoggedIn使用用户默认值布尔值)
我当时正在考虑将User类作为单例,或者以某种方式使类实例变为全局(尽管我很确定使其变为全局不是很好)。 还是如果我在选项卡控制器类中创建User类,是否可以使放置在UITabController类中的每个视图控制器均可访问该实例?您有什么建议?
谢谢!
答案 0 :(得分:0)
这是我对用户数据使用单个对象的方式,该对象既可以在我想要的任何视图控制器中使用,又可以保存数据。这利用Realm快速保存数据。要调用数据,只需创建变量即可,让user = User.getCurrentUser()
class User: Object, Decodable {
@objc dynamic var firstName: String? = ""
@objc dynamic var lastName: String? = ""
@objc dynamic var email: String = ""
@objc dynamic var signedIn: Bool = false
override static func primaryKey() -> String? {
return "email"
}
private enum CodingKeys: String, CodingKey {
case email
case firstName
case lastName
}
}
extension User {
func updateUser(block: (User) -> ()) {
let realm = UserRealm.create()
try? realm.write {
block(self)
}
static func getCurrentUser() -> User? {
let realm = UserRealm.create()
return realm.objects(User.self).filter("signedIn == %@", true).first
}
}
fileprivate let currentSchema: UInt64 = 104
struct UserRealm {
static func create() -> Realm {
do {
return try Realm(configuration: config)
} catch {
print(error)
fatalError("Creating User Realm Failed")
}
}
static var config: Realm.Configuration {
let url = Realm.Configuration().fileURL!.deletingLastPathComponent().appendingPathComponent("Users.realm")
return Realm.Configuration(fileURL: url,
schemaVersion: currentSchema, migrationBlock: { migration, oldSchema in
print("Old Schema version =", oldSchema)
print("Current schema version =", currentSchema)
print("")
if oldSchema < currentSchema {
}
}, shouldCompactOnLaunch: { (totalBytes, usedBytes) -> Bool in
let oneHundredMB = 100 * 1024 * 1024
return (totalBytes > oneHundredMB) && (Double(usedBytes) / Double(totalBytes)) < 0.5
})
}
}