iOS Swift 全局存储简单数据
iOS Swift storing simple data globally
iOS 开发的新手,正在尝试以正确的做法开发我的应用程序。我的主要问题是试图找出在全球范围内存储大量简单数据的最佳方式。
该应用程序连接到计算机的临时 wifi 并收集有关当前状态的信息。 (例如// gpu 温度、计算机名称、显示分辨率、date/time 等)。然后,我拥有的各种视图控制器允许用户调整其中一些设置,因此我希望能够跟踪所有视图控制器中的这些更改。
我一直在使用 plist、核心数据或单例 class 来存储所有信息。由于用户将在应用程序的整个生命周期内连接到一台计算机,因此我倾向于单例,因为它似乎最容易获取和设置数据。但是,我已经读到,出于各种原因,使用单例确实不是最佳实践。我已经阅读了一些 plists 和核心数据,似乎只是为了获取和设置值而做了大量工作。我应该花时间使用这些还是其他一些方法是完成所有这些的更好方法。
更新:
在 Aaoli 和 Swift Rabbit 的回答之后。我想为我的用例澄清,当应用程序关闭时,我存储的数据不需要 "saved"。因此,如果您遇到这个问题并且即使应用程序关闭也需要存储您的数据,请查看@SwiftRabbit 的回答。
在我的例子中,使用不敏感的 "simple" 数据,我通常使用用户默认值。可以通过项目在全球范围内访问它们。例如,可以这样设置:
var prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
prefs.setObject(myValue, forKey: "myKey") // myValue is of type typeOfValue
prefs.synchronize()
可以这样访问:
var prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
prefs.valueForKey("myKey") as? typeOfValue
使用 setObject 可以用于任何类型的值,这就是为什么我在从 userDefaults 检索它时强制转换它。您实际上可以使用其他方法来插入和检索它,这将使您的任务更容易。例如,您可以告诉您正在插入一个带有 :
的布尔值
prefs.setBool(<#value: Bool#>, forKey: <#String#>)
并指定您要检索一个:
prefs.boolForKey(<#defaultName: String#>)
所有方法都可以在苹果文档中找到here
要在 Swift 中使用全局变量,您需要在 class 之外定义结构,因为您不需要变量在没有绑定的情况下在整个应用程序内存中游动:
struct GlobalVar {
static var myvar = 0
}
要在任何地方简单地使用全局变量,请使用:
GlobalVar.myvar = 10
我的意见:创建一个单例,例如这样:
class MyClass {
/// The singleton instance
private static var singletonInstance: MyClass!
class var sharedInstance: MyClass! {
get {
singletonInstance = singletonInstance ?? MyClass()
return singletonInstance
}
}
private init() { }
}
或者这样:
class MySingletonClass {
static let sharedInstance = MySingletonClass()
private init() {
}
许多人认为 Singleton 是一种糟糕的设计模式,但在我看来并非如此。最好有一个模式来确保一条信息只能使用一次。不好的是可以从应用程序的任何地方全局访问这个 Singleton。有些人用 "Dependency Injection" 来抵消这一点,这基本上意味着你的 classes 没有 "pull" 来自 Singleton 的信息,但信息是 "pushed" into the class from (some other instance) outside.这促进了松耦合和更好的测试能力。但这是一个高级主题,需要更多信息。 (如果您对此感兴趣,Google "typhoon framework" for iOS)
iOS 开发的新手,正在尝试以正确的做法开发我的应用程序。我的主要问题是试图找出在全球范围内存储大量简单数据的最佳方式。
该应用程序连接到计算机的临时 wifi 并收集有关当前状态的信息。 (例如// gpu 温度、计算机名称、显示分辨率、date/time 等)。然后,我拥有的各种视图控制器允许用户调整其中一些设置,因此我希望能够跟踪所有视图控制器中的这些更改。
我一直在使用 plist、核心数据或单例 class 来存储所有信息。由于用户将在应用程序的整个生命周期内连接到一台计算机,因此我倾向于单例,因为它似乎最容易获取和设置数据。但是,我已经读到,出于各种原因,使用单例确实不是最佳实践。我已经阅读了一些 plists 和核心数据,似乎只是为了获取和设置值而做了大量工作。我应该花时间使用这些还是其他一些方法是完成所有这些的更好方法。
更新: 在 Aaoli 和 Swift Rabbit 的回答之后。我想为我的用例澄清,当应用程序关闭时,我存储的数据不需要 "saved"。因此,如果您遇到这个问题并且即使应用程序关闭也需要存储您的数据,请查看@SwiftRabbit 的回答。
在我的例子中,使用不敏感的 "simple" 数据,我通常使用用户默认值。可以通过项目在全球范围内访问它们。例如,可以这样设置:
var prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
prefs.setObject(myValue, forKey: "myKey") // myValue is of type typeOfValue
prefs.synchronize()
可以这样访问:
var prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
prefs.valueForKey("myKey") as? typeOfValue
使用 setObject 可以用于任何类型的值,这就是为什么我在从 userDefaults 检索它时强制转换它。您实际上可以使用其他方法来插入和检索它,这将使您的任务更容易。例如,您可以告诉您正在插入一个带有 :
的布尔值prefs.setBool(<#value: Bool#>, forKey: <#String#>)
并指定您要检索一个:
prefs.boolForKey(<#defaultName: String#>)
所有方法都可以在苹果文档中找到here
要在 Swift 中使用全局变量,您需要在 class 之外定义结构,因为您不需要变量在没有绑定的情况下在整个应用程序内存中游动:
struct GlobalVar {
static var myvar = 0
}
要在任何地方简单地使用全局变量,请使用:
GlobalVar.myvar = 10
我的意见:创建一个单例,例如这样:
class MyClass {
/// The singleton instance
private static var singletonInstance: MyClass!
class var sharedInstance: MyClass! {
get {
singletonInstance = singletonInstance ?? MyClass()
return singletonInstance
}
}
private init() { }
}
或者这样:
class MySingletonClass {
static let sharedInstance = MySingletonClass()
private init() {
}
许多人认为 Singleton 是一种糟糕的设计模式,但在我看来并非如此。最好有一个模式来确保一条信息只能使用一次。不好的是可以从应用程序的任何地方全局访问这个 Singleton。有些人用 "Dependency Injection" 来抵消这一点,这基本上意味着你的 classes 没有 "pull" 来自 Singleton 的信息,但信息是 "pushed" into the class from (some other instance) outside.这促进了松耦合和更好的测试能力。但这是一个高级主题,需要更多信息。 (如果您对此感兴趣,Google "typhoon framework" for iOS)