【问题标题】:iOS Equivalent For Android Shared PreferencesiOS 等效于 Android 共享首选项
【发布时间】:2013-10-12 23:01:34
【问题描述】:

我正在将 Android 应用程序移植到 iOS,我使用的一件事是 Android 中的 Shared Preferences 以在每次完成关卡时保存。

这样,当用户重新进入应用时,他们可以看到自己达到了 3 级或其他级别。

iOS 中是否有类似的机制?还是我必须手动写入特定于应用程序的文件?

如果是这样,我如何写出仅对我的应用程序可见的文件?

谢谢。

【问题讨论】:

  • 我猜在 iOS 中最接近这个的是NSUserDefaults。而here 是一个简单的例子,说明如何保存和检索。

标签: ios sharedpreferences


【解决方案1】:

使用 NSUserDefaults: - 请注意,这是针对少量数据的,例如您提到的当前级别。不要滥用它并将其用作大型数据库,因为每次打开应用程序时它都会加载到内存中,无论您是否需要它(应用程序的其他部分也会使用它)。

目标-C:

阅读:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

写作:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

.

斯威夫特:

阅读:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

写作:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}

【讨论】:

  • 你也可以使用条件绑定来快速读取if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel}
  • @chitti nope 那行不通,integerForKey 不返回可选
【解决方案2】:

这是 Swift 3 的更新

阅读

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

写作

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

更新

来自UserDefaults documentation

synchronize() 等待对默认数据库的任何挂起的异步更新并返回;这种方法现在是不必要的,不应该使用。

【讨论】:

    【解决方案3】:
    class Configuration {
    
        static func value<T>(defaultValue: T, forKey key: String) -> T{
    
            let preferences = UserDefaults.standard
            return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
        }
    
        static func value(value: Any, forKey key: String){
    
            UserDefaults.standard.set(value, forKey: key)
        }
    
    }
    

    例子

    //set
    Configuration.value(value: "my_value", forKey: "key_1")
    
    //get
    let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")
    

    【讨论】:

      【解决方案4】:

      根据前面的回答,您已经知道UserDefaults 相当于ios 中的共享首选项。您可以根据数据类型创建通用写入函数和读取创建函数。并从任何地方调用您所需的方法。

      ViewController.swift

       // write data
       writeAnyData(key: "MY_KEY", value: "MyData")
       // read string data 
       readStringData(key: "MY_KEY"), animated: true)
      

      Utils.swift

      // read and write user default
      let userDefault = UserDefaults.standard
      // write
      func writeAnyData(key: String, value: Any){
          userDefault.set(value, forKey: key)
          userDefault.synchronize()
      }
      
      // read int values
      func readIntData(key: String) -> Int{
          if userDefault.object(forKey: key) == nil {
              return 0
          } else {
              return userDefault.integer(forKey: key)
          }
      }
      
      // read string values
      func readStringData(key: String) -> String{
          if userDefault.object(forKey: key) == nil {
              return ""
          } else {
              return userDefault.string(forKey: key)!
          }
      }
      // read bool value
      func readBoolData(key: String) -> Bool{
          if userDefault.object(forKey: key) == nil {
              return false
          } else {
              return userDefault.bool(forKey: key)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        • 2012-09-20
        • 2012-09-03
        相关资源
        最近更新 更多