iOS开发新手,并尝试使用正确的做法开发我的应用。我的主要问题是试图找出在全球范围内存储大量简单数据的最佳方法。
该应用程序连接到计算机adhoc wifi并收集有关当前状态的信息。 (例如:// gpu temp,计算机名称,显示分辨率,日期/时间等)。然后,我拥有的各种视图控制器允许用户调整其中一些设置,因此我希望能够在所有视图控制器中跟踪这些更改。
我一直在使用plist,core数据或singleton类来存储所有信息。由于用户将在应用程序的生命周期内连接到一台计算机,我倾向于单身,因为它似乎最容易获取和设置数据。但是,我已经读过,由于各种原因,使用单例实际上并不是最佳实践。我已经阅读了一些关于plists和核心数据的内容,并且看起来像是为了获取和设置值而做的大量工作。我应该花时间使用它们还是其他方法是更好的方法来完成所有这些。
更新 在Aaoli和Swift Rabbit的回答之后。我想澄清我的用例,当应用程序关闭时,我存储的数据不需要“保存”。因此,如果您要回答这个问题并且需要存储您的数据,即使应用程序关闭,请查看@ SwiftRabbit的答案。
答案 0 :(得分:8)
要在Swift中使用全局变量,您需要在类之外定义struct,因为您不需要变量在整个应用程序内存中游动而不绑定:
struct GlobalVar {
static var myvar = 0
}
从任何地方使用简单地使用全局变量:
GlobalVar.myvar = 10
答案 1 :(得分:5)
在我的情况下,使用不敏感的“简单”数据,我通常使用用户默认值。可以通过项目全局访问它们。例如,它可以这样设置:
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检索它时强制转换它的原因。您实际上可以使用其他方法来插入它并检索它,这将使您的任务更容易。例如,你可以告诉你插入一个bool:
prefs.setBool(<#value: Bool#>, forKey: <#String#>)
并指定您正在检索一个:
prefs.boolForKey(<#defaultName: String#>)
所有方法都可以在Apple文档here
中找到答案 2 :(得分:2)
我的观点:创建一个单身人士,例如这样:
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。有些人用#34; Dependency Injection&#34;来反击这一点,这基本上意味着你的课程没有&#34;拉&#34;来自Singleton的信息,但信息是&#34;推送&#34; 从(某些其他实例)外部进入类。这促进了松耦合和更好的测试能力。但这是一个需要更多信息的高级主题。 (Google&#34;台风框架&#34;对于iOS,如果您对此感兴趣)