如何在Swift中全局存储用户类实例

时间:2020-10-07 13:37:27

标签: swift

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

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

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

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

谢谢!

1 个答案:

答案 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
    })
}
}