不确定这是一个错误还是什么 . 我有两个不同的值,我想在userDefaults中设置,一个是 isLoggedIn 状态,另一个是 isOwner 状态,这是一个优先级/权限 .

当用户首次登录时,一切正常 . 如果用户是所有者并且已登录,则两种状态都保存在控制台内 . 已调用 print(UserDefaults.standard.dictionaryRepresentation()) 并且它们都打印到控制台 .

我可以使用该应用程序,但它工作正常 . 然而,如果我强行崩溃应用程序(双击主页按钮并删除应用程序在后台运行),其中一个状态最终会被删除 . 它可以是任何一种状态,迫使应用程序变得越来越多 .

这是一个错误吗?我怎么能避免这个?

extension UserDefaults {

enum UserDefaultsKeys: String {
    case isOwner
    case isLoggedIn
    case latitude
    case longitude
}


func setIsOwner(value: Bool) {
    set(value, forKey: UserDefaultsKeys.isOwner.rawValue)
    synchronize()
}

func setIsLoggedIn(value: Bool) {
    set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue)
    synchronize()
}

func setCoordinates(coordinate: Coordinate) {

    set(coordinate.latitude, forKey: UserDefaultsKeys.latitude.rawValue)
    set(coordinate.longitude, forKey: UserDefaultsKeys.longitude.rawValue)

    synchronize()
}

func isOwner() -> Bool {
    return bool(forKey: UserDefaultsKeys.isOwner.rawValue)
}

func isLoggedIn() -> Bool {
    return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue)
}

func coordinates() -> (latitude: Double, longitude: Double)? {
    if let latitude = string(forKey: UserDefaultsKeys.latitude.rawValue),
        let longitude = string(forKey: UserDefaultsKeys.longitude.rawValue) {
        return (latitude: Double(latitude)!, longitude: Double(longitude)!)
    } else {
        return nil
    }
}
}

所以要设置 isLoggedIn 状态或 isOwner 状态:

UserDefaults.standard.setIsLoggedIn(value: true)
UserDefaults.standard.setIsOwner(value: isOwner)  // isOwner is a boolean value

仅当用户创建帐户或用户登录时,才会在两个位置调用此设置 .

然后,当用户注销时,我只在一个地方删除UserDefaults:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
    if key != UserDefaults.UserDefaultsKeys.latitude.rawValue &&
        key != UserDefaults.UserDefaultsKeys.longitude.rawValue {
        UserDefaults.standard.removeObject(forKey: key)
    }
}

我可以登录并将两个值打印到控制台 . 如果我在5秒或5分钟内强制崩溃应用程序,则其中一个设置为dissapear的UserDefaults值

extension UIViewController
{

func isOwner() -> Bool {
    return UserDefaults.standard.isOwner()
}

func isLoggedIn() -> Bool {
    return UserDefaults.standard.isLoggedIn()
}
}

.

class ViewController: UIViewController {

override func viewWillAppear(_ animated: Bool) {
    if isOwner() {
        sectionOne = ["Account details", "Profile"]
        sectionTwo = ["Posts you've liked", "Messages"]
        sectionFour = "Log out"
    } else if isLoggedIn() {
        sectionOne = ["Account details"]
        sectionTwo = ["Posts you've liked"]
        sectionFour = "Log out"
    } else {
        sectionOne.removeAll()
        sectionTwo.removeAll()
        sectionFour = "Log in"
    }
}
tableView.reloadData()
}

使用 UITabBarController 来思考Instagram . 上面的代码将存在于最后一个选项卡 Accounts 选项卡中 . 当视图出现时,它将根据需要重新传输tableView .