在视图控制器之间共享数据的单例或委派

时间:2012-06-03 03:51:14

标签: iphone

我搜索了SO,寻找在视图控制器之间共享数据的不同方法。我看到传递数据的委托是ppl建议的最常见的方式,并且一些人使用单例来从应用程序的任何地方获得信息。我还不熟悉Core Data,但从我到目前为止看来,似乎Core Data类似于Singleton,在ManagedObjectContext中,你可以访问数据。因此,只要您有对该对象的引用,您就可以访问该数据(如果理解错误,请随时纠正我)。

在这种情况下,我想知道是否应该使用委托或单身人士。我基本上有一个带有两个标签的标签栏控制器。一个选项卡使用委托在视图之间来回传递数据,或者在要呈现的视图上分配属性。

第二个选项卡是第一个选项卡的摘要视图。因此,在完全不同的视图堆栈上,我需要与Tab一中相同的数据。在那种情况下,我应该使用Singleton,以便可以从应用程序的任何位置访问它吗?或者有更好的解决方案吗?

此外,我想知道如果您的应用程序即将关闭,您将如何归档数据。在我看来,如果我确实实现了一个单例,当我收到我的应用程序将要进入后台的通知时,我可以查看我的单例并保存数据。但是如果我不使用单例,当应用程序进入后台时如何保存数据。我是否将该保存代码放在app委托中。

我想最终我试图了解在这种情况下哪种设计模式更适合在应用程序之间存档和共享数据。谢谢!

1 个答案:

答案 0 :(得分:0)

我浏览了这篇关于核心数据的精彩教程: http://timroadley.com/2012/02/09/core-data-basics-part-1-storyboards-delegation/

使用的方法是:您的ManagedObjectContext首次在AppDelegate中初始化。然后在我的根视图控制器中,我从appdelegate中检索ManagedObjectContext。然后在prepareForSegue中,将managedObjectContext传递给推送的视图控制器。

AppDelegate具有__managedObjectContext的只读访问器属性,该属性负责首次创建此单例对象。

在每个视图控制器中,我在viewWillAppear上设置了fetchedResultsController,其中包含我想要的核心数据实体。然后,当用户点击保存按钮时,我直接写入核心数据。在我的特定应用程序中,我有一个明确的“取消”按钮,因为用户可能会犯错误,或意外删除可编辑的文本数据。但是,您可以在每个控件的更改值后立即保留更改,就像在iOS中的“设置”菜单中一样。我更喜欢取消/保存方法,因为我的数据的性质。一些研究是为了看你是否必须重新保存整个对象,或者只能更新coredata中的各个字段。

如果直接从managedObjectContext读取/写入,核心数据几乎可以解决您的问题。数据会立即保留,并立即更新。如果您的数据没有故意保留,那么委派是在屏幕之间传递它的好方法。如果您需要通知一大堆您不想了解非持久数据的视图控制器,请考虑将NSNotificationCenter与对象或字典一起使用。
Send and receive messages through NSNotificationCenter in Objective-C?