swift - 让我们让初学者清楚地了解跨多个 View Controller 的 MVC、单例和数据共享

标签 swift model-view-controller singleton

能够在多个 View Controller 之间共享数据并以使用推荐模式(如 MVC)的方式进行共享似乎对于创建好的应用程序至关重要,但我的问题是这些事情并不清楚对我来说完全没有。 我知道这个问题真的很复杂,但为了让事情变得清晰,我认为你真的需要了解整个事情。

首先我们需要确定模型、 View 和 Controller 在做什么,下面是我将如何描述它们,请告诉我我的说法是否正确:

  • 模型:一个负责管理数据的类,并且只有那个(例如,一个将在网络上检索信息的类,例如天气预报).
  • View : View 是显示给用户的对象,用户可以经常与之交互,也就是您可以在 Interface Builder 中拖放的对象(例如按钮) 您也可以从头开始创建一个,或者通过子类化来自定义一个已经存在的。
  • Controller : Controller 负责管理 View 及其 subview ,它接收事件(例如 viewDidLoad,甚至当用户点击按钮时)并可以对其使用react,例如,它可能会更改标签的文本。

现在关于它们之间交互的方式,我会说 Controller 介于 View 和模型之间,它管理 View 并可能向模型请求数据。除了从 View 接收事件外,它还可能从模型接收事件,例如,如果 Controller 向模型询问网络上的特定数据(假设它询问特定城市的天气),则数据将获胜' 立即可用,相反,模型将通知 Controller ,以便它可以使用收到的数据更新 View 。 我说得对吗?

我想知道的第一件事是如果一个对象不是用来检索数据,而是用来做其他简单的事情,是否可以将其视为模型与 View 无关,例如,负责通信和管理蓝牙配件的对象是否可以视为模型?可以将数据发送到云的对象视为模型吗?那么 Tic Tac Toe AI 呢?

然后,单例实例,当一个应用程序必须在多个 View 之间共享数据时,我经常听说它们,但首先,我从来没有真正理解为什么在这种情况下有必要使用它们?

然后,这是我在 an article of the We Heart Swift website 中找到的一个单例.

class Singleton {
    struct Static {
        static let instance = Singleton()
    }

    class var sharedInstance: Singleton {
        return Static.instance
    }
}

Singleton.sharedInstance

问题是,我很难在任何地方找到有关为什么以这种方式编写的更多详细信息,最重要的是,单例可以有一个接受参数的初始化程序吗?如何将属性和方法添加到像这样的单例中? Static 结构和 sharedInstance 到底是什么?

我的最后一个问题是,从技术上讲,为什么单例可以访问我们在其他地方定义的内容?我的意思是,如果我在我的 AppDelegate 中创建一个实例,比方说,一个 Dog 类,并且如果我想在 View Controller 中访问这个特定实例,那么这是不可能的,那么单例如何在幕后使这成为可能呢?

编辑:哦,还有,Apple 推荐使用单例吗?

谢谢。

最佳答案

它与结构中的 static 有关。 Static 本质上是一个类变量,对于该类的每个实例都存在,因此当您将共享实例设置为静态时,每次访问它时,即使是 Singleton.instance 的另一个实例也是同一个变量因为它是静态的。它在实例中持续存在。然而,Swift 还不支持类变量,所以当它支持时,应该会很快取代单例中常见的 Struct 语法。它与java中的静态变量非常相似。

例如:

class Singleton { 
    var someVar = 0 


    struct Static { 
        static let instance = Singleton() 
    } 
}

创建一个带有变量的单例并通过以下方法访问它:

let foo = Singleton.Static.instance 
foo.someVar = 11 

let bar = Singleton.Static.instance 
println(bar.someVar) // Prints 11

如您所见,bar.someVar 从未设置,这是因为共享实例的变量已设置,所以它打印 11。

关于swift - 让我们让初学者清楚地了解跨多个 View Controller 的 MVC、单例和数据共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27978376/

相关文章:

ios - 如何为WKWebView设置代理?

php - 在 PHP 中扩展单例

ios - Swift:许多内置函数返回 Optional 类型。如何在没有丑陋的嵌套 ifs 的情况下将它们变成常规变量?

javascript - ExtJs4 MVC,组合框的数据存储

model-view-controller - StringLength 在 MVC4.0 中未按预期工作

javascript - JavaScript 中的模型- View - Controller

c++ - 这个单例实现有问题吗?

python - 使用函数的单例实现

swift - 为什么我不能在Swift中将(String)-> String转换为(Any)-> Any?

swift - 使用Sprite Kit中TileMap的物体位置