繁体   English   中英

在iOS中保存对象引用的最有效方法?

[英]Most efficient way to save object references in iOS?

在我正在处理的应用程序中,我有一个注释对象。 这个音符对象可以有一个超级音符和许多子音符; 基本上,我正在创建一个笔记层次结构。 它的运行方式实际上与UIView非常相似。

无论如何,我需要能够保存这些数据。 我使用过Core Data并了解您可以在特定对象之间创建关系,并且每个托管对象都可以具有原始属性(可转换类型除外)。 但是,我不确定在一个音符,它的超级视图和它的子视图之间创建一个关系是否是最实用 - 甚至是可能的方式。

话虽如此,我想得到一些观点。 如果我必须保存一系列注释,并且其中许多注释都有相互引用(与视图相同),最好的方法是什么?

我是这样做的:

1)使用Core Data和(可选) Mogenerator 特别是当您的应用程序功能不断增长时,您会很高兴。

2)在数据模型中创建Note实体。

3)在Note实体上,创建一个多对多关系,称为notes ,指向Note自身 )与一对一关系,称为parentNote 所以,你会有这样的双向关系:

parentNote << ---> notes (含义:一个parentNote和一个或多个notes

兴趣点

正如你所提到的, UIView做了与此非常相似的事情。 基本上,每个UIView都有一个subviews数组,每个subview引用其父视图superview 所以你在每个UIView上都有这种双向关系:

superview << ---> subviews

每个请求的屏幕截图:

Note仅显示关系的实体:

在此输入图像描述

notes关系:

在此输入图像描述

parentNote关系:

在此输入图像描述

同样感兴趣的是delete rules -我建议你设置cascadenotes ,并nullifyparentNote关系(这将意味着一个parentNote 拥有其子notes ,所以当它被删除,他们太)。 但是,请确保这是您想要的行为。

您需要区分Core Data Note实体和视图。 因此,通常您不会在Note(我假设这是Core Data Note对象或记录)及其超级和子视图之间创建关系。

您的MODEL表示Notes(包含文本和/或图像)之间的关系,如果它是一个层次结构,那么Note可以有子项和父项。 如果它更复杂,因为您想要在层次结构的不同分支上链接Notes,那么您需要另一个linkedNotes关系。

我有几个应用程序执行前者(维护富文本注释的层次结构加上一些数据字段) - 请参阅显示文件夹和文档层次结构的屏幕截图(使用相同的核心数据实体进行持久化,并使用单个标记指示它是否为文件夹与否,如果它不是一个文件夹,它不能有子项,但这不是由数据库强制执行的,它是在应用程序逻辑中强制实施的)。 下面的层次结构是无限的,Core Data维护这些引用,nil parent表示它的根节点。

关于实际显示每个音符的视图,这取决于您尝试做什么。 在下面的应用程序中,有两个视图,一个显示文档的层次结构,另一个显示所选文档的详细信息。 层次结构允许用户可以拖放项目或整个分支(项目)或将它们复制并粘贴到另一个文档或部分,详细信息视图允许编辑项目。

与UI相关联的app逻辑管理由于这些用户动作而维护Core Data对象之间的关系的状态。 但是,Core Data用于保存状态,包括是否扩展文件夹。

还有另一个iOS应用程序使用这个完全相同的文档(核心数据存储)在iPad或iPhone上显示相同的信息(使用不同的视图,具体取决于设备和设备的方向)。 在iOS上使用不同的UI控件(UITableView)完成导航层次结构,但同样可以在层次结构中移动对象,并且Core Data会维护和保持关系中的关联更改。 通过iCloud同步,任何此类更改都会复制到运行相同应用程序的其他设备,并且这些更改会在Core Data导入后通过接收设备上的UI反映出来。

这是保存对象引用和维护关系的最有效方法,我的猜测是肯定的,因为已经为您完成了很多与UI控件的集成,您获得跨平台支持并获得iCloud集成。

编辑:如果你认为这是你想要做的事情,很高兴发布一些代码示例。 核心数据模型和NSManagedObject子类可以帮助您了解模型。

在此输入图像描述

在此输入图像描述

暂无
暂无

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

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