繁体   English   中英

iOS Swift全局存储简单数据

[英]iOS Swift storing simple data globally

iOS开发新手,尝试用正确的做法开发我的应用程序。 我的主要问题是试图找出在全球范围内存储大量简单数据的最佳方法。

该应用程序连接到计算机adhoc wifi并收集有关当前状态的信息。 (例如:// gpu temp,计算机名称,显示分辨率,日期/时间等)。 然后,我拥有的各种视图控制器允许用户调整其中一些设置,因此我希望能够在所有视图控制器中跟踪这些更改。

我一直在使用plist,core数据或singleton类来存储所有信息。 由于用户将在应用程序的生命周期内连接到一台计算机,我倾向于单身,因为它似乎最容易获取和设置数据。 但是,我已经读过,由于各种原因,使用单例实际上并不是最佳实践。 我已经阅读了一些关于plists和核心数据的内容,并且看起来像是为了获取和设置值而做的大量工作。 我应该花时间使用它们还是其他方法是更好的方法来完成所有这些。

更新:在Aaoli和Swift Rabbit的答案之后。 我想澄清我的用例,当应用程序关闭时,我存储的数据不需要“保存”。 因此,如果您要解决这个问题并且需要存储您的数据,即使应用程序关闭,请查看@ SwiftRabbit的答案。

要在Swift中使用Global变量,您需要在类之外定义struct,因为您不需要变量在整个应用程序内存中游动而不绑定:

struct GlobalVar {
    static var myvar = 0

}

要在任何地方使用简单的全局变量:

GlobalVar.myvar = 10

在我的情况下,使用不敏感的“简单”数据,我通常使用用户默认值。 可以通过项目全局访问它们。 例如,它可以这样设置:

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文档中找到

我的观点:创建一个单例,例如以这种方式:

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。 有些人用“依赖注入”来反作用,这基本上意味着你的类不会从Singleton中“拉”出信息,但是信息会从外部(某些其他实例)“推送” 类中。 这促进了松耦合和更好的测试能力。 但这是一个需要更多信息的高级主题。 (如果您对此感兴趣,请使用适用于iOS的谷歌“台风框架”)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM