【问题标题】:My Userdefault is not saving data and its not being mapped by ObjectMapper in swift我的 Userdefault 没有保存数据,也没有被 ObjectMapper 快速映射
【发布时间】:2020-06-11 13:52:48
【问题描述】:

我希望客户注册并在输入数据后将其映射到用户默认值并保存在那里,当我想验证用户时,我调用一个函数验证获取从用户保存的数据以验证用户但 GET 中的数据映射不起作用

var UserInfoDefualts: UserModel {
    set {
        let userJson = try! JSONEncoder().encode(newValue)
        let jsonString = String(data: userJson, encoding: .utf8)!
        KeychainWrapper.standard.set(jsonString, forKey: "UserData")
    }
    get {
        let userJosn = KeychainWrapper.standard.string(forKey: "UserData") ?? ""

        let userData = Mapper<UserModel>().map(JSONString: userJosn) ?? UserModel()
        return userData
    }
}

get 未映射数据 userdata 始终为 NIL,其中设置其 Filled 正确

注册功能

@IBAction func continueButtonClicked(_ sender: UIButton) {
ApiServices.shared.signUp(name: fullName.text!, number: phoneNumber.text!, gender: 1, date: birthDate.text!) { (result, statusCode) in
    print(result)
    if statusCode == 200 {
        let userData = result
        print(userData.fullName)
        UserInfoDefualts = userData
        ScreenLoader().pushVC(rootView: self, viewController: Verify_VC)
           // Shared.logIn(userData: userData)

    }
}

}

验证函数

    @IBAction func verifyClicked(_ sender: Any) {
        var data = UserInfoDefualts
        ApiServices.shared.verifyUser(userID: UserInfoDefualts.userId ?? 0, otpCode: self.code) { (result, statusCode) in
            if statusCode == 200 {
                ScreenLoader().pushVC(rootView: self, viewController: Welcome_VC)
            }
        }
    }

【问题讨论】:

  • 再次忘记过时的ObjectMapper 并使用Decodable 解码数据。
  • @vadian 你能告诉我怎么做吗,我已经将 Decodable 添加到我的 Struct USERMODEL

标签: swift objectmapper userdefaults


【解决方案1】:

在结构中将Encodable 替换为Codable 并删除与ObjectMapper 相关的所有代码

然后用

替换计算的属性
var userInfoDefaults: UserModel? {
    set {
        let userJson = try! JSONEncoder().encode(newValue!)
        let jsonString = String(data: userJson, encoding: .utf8)!
        KeychainWrapper.standard.set(jsonString, forKey: "UserData")
    }
    get {
        guard let userJosn = KeychainWrapper.standard.string(forKey: "UserData") else { return nil }

        let data = Data(userJosn.utf8)
        do {
          return try JSONDecoder().decode(UserModel.self, from: data)
        } catch {
          print(error)
          return nil
        }
    }
}

由于UserModel 没有自定义初始化程序,因此计算属性必须是可选的。所以你必须在IBAction中写

guard let data = userInfoDefaults else { return }

【讨论】:

    【解决方案2】:

    您可以将 objectmapper 对象存储在 userdefault 中,如下所示:

    if let userInfo = Mapper<SignInModel>().map(JSONObject: dictionary["signup"]) {
    if let JSONString = Mapper().toJSONString(userInfo, prettyPrint: true) {
    
    //User Info:-
    let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: JSONString)
    UserDefaults.standard.set(encodedData, forKey: "userinfo")
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多