让我们让初学者清楚地了解跨多个视图控制器的 MVC、单例和数据共享



能够在多个视图控制器之间共享数据并以利用推荐模式(如 MVC)的方式执行此操作,这对于创建良好的应用程序似乎至关重要,但我的问题是这些事情对我来说根本不清楚。我认真地认为这个问题真的很密集,但为了清楚事情,我认为你真的需要了解整个事情。

首先,我们需要确定模型,视图和控制器正在做什么,以下是我将如何描述它们,请告诉我我是否正确

  • 模型 :一个负责管理数据的类,并且只负责管理数据(例如,一个将在网络上检索信息的类,例如天气预报)。
  • 视图
  • 视图是向用户显示的对象,用户通常可以与之交互,这是您可以在界面生成器中拖放的对象(例如按钮),您也可以从头开始创建一个,或者通过子类化来自定义已经存在的对象。
  • 控制器
  • 控制器负责管理视图及其子视图,它接收事件(例如viewDidLoad,甚至当用户点击按钮时)并可以对其做出反应,例如,它可能会更改标签的文本。

现在关于它们之间交互的方式,我想说控制器位于视图和模型之间,它管理视图,并且可能会向模型请求数据。除了从视图接收事件外,它还可能从模型接收事件,例如,如果控制器向模型请求 Web 上的特定数据(假设它询问特定城市的天气),则数据不会立即可用,相反,模型将通知控制器,以便它可以用收到的数据更新视图。我说的对吗?

我想知道的第一件事是,如果一个对象不是在这里检索数据,而是做其他与视图无关的事情,是否可以将它视为模型,例如,负责通信和管理蓝牙配件的对象是否可以被视为模型?将数据发送到云的对象可以被视为模型吗?那么井字游戏人工智能呢?

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

然后,这是我在We Heart Swift网站的一篇文章中找到的一个单例。

class Singleton {
    struct Static {
        static let instance = Singleton()
    }
    class var sharedInstance: Singleton {
        return Static.instance
    }
}
Singleton.sharedInstance

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

我的最后一个问题是,从技术上讲,为什么单例可以访问我们在其他地方定义的东西?我的意思是,如果我在我的 AppDelegate 中创建一个 Dog 类的实例,并且如果我想在视图控制器中访问此特定实例,那么这是不可能的,那么单例如何在后台使之成为可能?

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

谢谢。

它与结构中的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。

最新更新