首页 > 解决方案 > 如何在 Swift 中全局存储用户类实例

问题描述

我已经在 swift 中编写了很短的时间,并希望创建我的第一个正确完整的应用程序。我的应用程序以 UITabController 开头(在我实现的部分登录之后)将带有一个“配置文件”页面,用户可以在其中更新有关自己的信息(用户名等)。

因此,我创建了一个 User 类来保存这些信息,并将在未来与服务器通信以更新用户信息。

我只希望在整个应用程序中实例化一个 User 类对象(但仍然可以在任何地方访问),因为只有一个用户可以在手机上登录,这样做的最佳做法是什么?还可能值得注意的是,登录部分会记住用户已登录,因此他们不必重新登录(使用用户默认布尔值用于 isLoggedIn)

我正在考虑将 User 类设为单例,或者以某种方式将类实例设为全局(尽管我很确定将其设为全局并不是很好)。或者,如果我在选项卡控制器类中创建 User 类,是否有办法使放置在 UITabController 类中的每个视图控制器都可以访问该实例?你有什么建议吗?

谢谢大家!

标签: swift

解决方案


这就是我将单个对象用于用户数据的方式,该对象在我想要的任何视图控制器中都可用,但也允许保存数据。这利用 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
    })
}
}

推荐阅读