swift - 如何在 Swift 中全局存储用户类实例
问题描述
我已经在 swift 中编写了很短的时间,并希望创建我的第一个正确完整的应用程序。我的应用程序以 UITabController 开头(在我实现的部分登录之后)将带有一个“配置文件”页面,用户可以在其中更新有关自己的信息(用户名等)。
因此,我创建了一个 User 类来保存这些信息,并将在未来与服务器通信以更新用户信息。
我只希望在整个应用程序中实例化一个 User 类对象(但仍然可以在任何地方访问),因为只有一个用户可以在手机上登录,这样做的最佳做法是什么?还可能值得注意的是,登录部分会记住用户已登录,因此他们不必重新登录(使用用户默认布尔值用于 isLoggedIn)
我正在考虑将 User 类设为单例,或者以某种方式将类实例设为全局(尽管我很确定将其设为全局并不是很好)。或者,如果我在选项卡控制器类中创建 User 类,是否有办法使放置在 UITabController 类中的每个视图控制器都可以访问该实例?你有什么建议吗?
谢谢大家!
解决方案
这就是我将单个对象用于用户数据的方式,该对象在我想要的任何视图控制器中都可用,但也允许保存数据。这利用 Realm 快速保存数据。要调用数据,您只需创建变量 let 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
})
}
}
推荐阅读
- android - Qmetry 错误:基础驱动程序是 QAFExtendedWebDriver。此步骤需要 AndroidDriver
- python - 为什么python可执行文件的图标从'dist文件夹中消失了?
- python-3.x - SQLAlchemy 创建的测试连接
- jenkins - 詹金斯文件存在条件步骤 - 变量用法?
- javascript - 二叉搜索树是平衡的Javascript
- javascript - 传单覆盖不出现,但没有 Javascript 控制台错误
- excel - 用宏对重叠文本进行颜色编码
- vba - ME23N 发布 - 无法通过 ID 找到控件
- azure - 如何在 Azure IoT 中心定位消息?
- ddev - Internet connection not detected