【问题标题】:UserDefault for ios Appios 应用的用户默认值
【发布时间】:2018-03-05 07:08:49
【问题描述】:

我正在创建一个应用程序,我希望用户在使用该应用程序注册帐户后一直登录,直到用户决定删除该帐户。 它的工作原理类似于whatsapp。我是否正确使用 userdefault 来存储用户在注册过程中输入的内容?然后假设我有一个 registerviewcontroller.swift 和一个 userviewcontroller.swift,我如何从 userviewcontroller.swift 调用存储在 registerviewcontroller.swift 中的 userdefault 用户数据?

我正在使用 ios 11 和 swift 4。 请帮忙。谢谢你。

【问题讨论】:

标签: ios swift userdefaults


【解决方案1】:

在 registerviewcontroller.swift 中声明类似这样的内容。

let userName=dict["user_name"] as? String

 UserDefaults.standard.set(userName, forKey: "user_name")

从 userviewcontroller.swift 像这样使用

 let userName  =  UserDefaults.standard.string(forKey: "user_name")

【讨论】:

    【解决方案2】:

    要在 userdefault 中保存和检索用户信息,您需要类似

    class Helper {
     static func setUserInfo( userinfo: UserInfo?) {
    
        if let info = userinfo {
    
            UserDefaults.standard.setValue(NSKeyedArchiver.archivedData(withRootObject: info), forKey: "USERINFO")
    
        }
        else {
    
            UserDefaults.standard.setValue(nil, forKey: "USERINFO")
    
        }
    
        UserDefaults.standard.synchronize()
    
    }
    
    static func getUserInfo() -> UserInfo? {
    
        if let data = UserDefaults.standard.value(forKey: "USERINFO") {
    
            return (NSKeyedUnarchiver.unarchiveObject(with: data as! Data) as! UserInfo)
    
        }
    
        return nil
    
    }
     }
    

    这里是 userInfo 类 //这里我使用 objectmapper lib,你可能/不需要相应地

    class UserInfo: NSObject, NSCoding, Mappable {
    
    var patientId: String?
    var authKey : String?
    
    
    
    override init() {
        super.init()
    }
    
    required init?(map: Map){
    
    }
    
    func mapping(map: Map) {
        patientId <- map["patient_id"]
    authKey <- map["authKey"]
    
    }
    
    required init?(coder aDecoder: NSCoder) {
        patientId = aDecoder.decodeObject(forKey: "patientId") as? String
        authKey = aDecoder.decodeObject(forKey: "authKey") as? String
    
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(patientId, forKey: "patientId")
        aCoder.encode(authKey, forKey: "authKey")
    
    }
    
    
    }
    

    现在在您的注册视图控制器中,在 viewdidload 方法中

    if let _ = Helper.getUserInfo() { // there is user logged in, i.e. user installed the app and registered earlier
            if let mainModuleTabBar = StoryboardHelper.mainModuleStory().instantiateViewController(withIdentifier: MyTabBarController.controllerIdentifier) as? MyTabBarController {
                let window = (UIApplication.shared.delegate as! AppDelegate).window
                window?.rootViewController = mainModuleTabBar
                window?.makeKeyAndVisible()
            }
            return
        }
    

    【讨论】:

      【解决方案3】:

      您在 Userdefaults 中存储的任何内容都可以在整个应用程序中访问。它与任何特定的视图控制器相关。

      用户默认值以 plist 文件的形式存储在应用程序的数据容器中。

      存储用户默认值

      UserDefaults.standard.setValue("<Value>", forKey: "<Key>")
      UserDefaults.standard.synchronize()
      

      访问用户默认值

      UserDefaults.standard.value(forKey: "<Value>")
      

      【讨论】:

      【解决方案4】:

      保存整数、布尔值、字符串、数组、字典、日期等,但应注意不要保存太多数据,因为这会减慢您的应用在 Swift 4 中的启动速度

      let defaults = UserDefaults.standard
      defaults.set(25, forKey: "intkey")
      defaults.set(true, forKey: "boolkey")
      defaults.set(CGFloat.pi, forKey: "floatkey")
      
      defaults.set("Paul Hudson", forKey: "stringkey")
      defaults.set(Date(), forKey: "datestore")
      

      【讨论】:

        【解决方案5】:

        要保存和检索 userdefaults 中的值,您应该使用下面的 util 方法。

        import UIKit
        
        class PersistanceManager: NSObject {
        
        /// Set value in user defaults
        ///
        /// - Parameter key: key for which value to be saved in user defaults
        /// - Returns: value to save in user default
        static func getPersistenceValueForKey(key : String) -> Any?{
            if let value = UserDefaults.standard.value(forKey: key){
                return value
            }
            return nil
        }
        
        
        /// Retrieve value from user default for the key
        ///
        /// - Parameters:
        ///   - value: value fetched for the key from user defaults
        ///   - key: key for which value to be retrived
        static func setPersistence(value : Any? , forKey key:String){
            if !key.isEmpty {
                if let value = value {
                    UserDefaults.standard.setValue(value, forKey: key)
                    UserDefaults.standard.synchronize()
                }
                else {
                    UserDefaults.standard.removeObject(forKey: key)
                }
                //Doing the syncronize in async queue. performance Fix
                let persistenceQueue = DispatchQueue(label: "ID")
                persistenceQueue.async(execute: {() -> Void in
                    UserDefaults.standard.synchronize()
                })
            }
          }
        }
        

        【讨论】:

        • .synchronize() 已过时、无用并且可能导致问题。这在当前文档中进行了解释。请从您的答案(以及您的代码库)中删除此行。
        • @ayaio 写的内容在documentation page for UserDefaults.synchronize() 上有说明:“这种方法是不必要的,不应该使用”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        相关资源
        最近更新 更多