强制应用程序崩溃后删除userDefaults

时间:2017-05-26 09:46:35

标签: ios swift nsuserdefaults

不确定这是一个错误还是什么。我有两个不同的值,我想在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。

0 个答案:

没有答案