UIManagedDocument + iCloud“大图”?

2023-12-22

我正在开发我的第一个“iCloud 应用程序”。我浏览了 Apple 文档和斯坦福大学视频,但我仍然很难理解 iCloud 的“大局”。

我的目标是创建一个“图书馆风格 http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/_index.html“应用程序(这是苹果公司对具有“单个核心数据堆栈、单个持久性存储协调器和单个持久性存储”的应用程序的术语),例如员工示例 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html.

在斯坦福大学视频之后,我使用 UIMangedDocument 来设置所有核心数据内容并启用 iCloud 功能。 UIMangedDocument 包含数据库并“存储在云中”。

这已经是我遇到的第一件事:“存储在云端”的真正含义是什么?

在我开始使用 iCloud 之前,我认为“在云中存储文档”意味着“在云中存储文档的副本”。我认为常规沙箱中会有我的文档的本地版本,并且云中会有该文档的副本。当本地文档发生更改时,这些更改也会传输到云版本。据我现在了解,这是不正确的(至少不完全正确)。我对吗?

使用 iCloud 我要做的第一件事就是打电话URLForUbiquityContainerIdentifier:。这将返回“iCloud URL”,这意味着云中文件夹的 URL。存储在该 URL 下的所有文件都将“存储在云端”,对吗?

我的第一个假设(本地文件+云中的副本)并不是完全错误的。事实上,存储在云中的任何文件都有“本地版本”和“云版本”。这是因为即使设备当前没有互联网连接,我也可以访问 iCloud URL 并将文件存储在该位置。但这只是 iCloud 框架的神奇之处,我不必担心。从我的角度来看,云只是一个特殊的文件夹,该文件夹中的任何文件或目录都存储在云中。仅当在设备设置中停用 iCloud 时,iCloud URL 才会为 NIL。是对的吗?

我遇到的第二件事是 iCloud 如何将更改同步到文档。假设设备 A 上的“TheApp”创建了一个 UIManagedDocument 并存储在云端。之后设备A离线。同时设备 B 上的 TheApp 会访问该文档并添加一些数据(例如插入一些新员工或部门)。当设备B再次上线时,会收到NSPersistentStoreDidImportUbiquitousContentChangesNotification并且可以合并所有呼叫mergeChangesFromContextDidSaveNotification:在文档的 ManagedObjectContext 上复制这些更改。

我无法确定合并更改是否真的有必要。如上所述,从我的角度来看,只有一个文档。如果这是真的,那么很高兴我收到有关更改的通知,但没有必要将这些更改复制到文档的“本地版本”,因为不存在“本地版本”之类的东西。这让我想到了 mergeChangesFromContextDidSaveNotification: 有什么好处的问题。

另一种情况与以前的情况相同(在设备 A 上创建文档,在设备 B 上更改...),但现在设备 A 不仅离线,而且在设备 B 上进行更改时 TheApp 完全关闭。在这种情况下,TheApp设备 A 上的文档再次启动后必须重新创建/重新打开该文档。什么should在这种情况下会发生什么?

我确实进行了一些测试,但结果并不总是相同。在某些情况下,文档以其“旧”版本开始,然后收到更改通知。在其他情况下,文档直接从新版本开始,并进行了所有更改。对于我的应用程序,第一种情况(从旧版本开始,接收更新通知)会更好,但我无法强制执行这种或另一种行为。这是它应该起作用的吗?

非常感谢!


一般来说,我可以推荐阅读iCloud 设计指南 http://developer.apple.com/library/mac/#documentation/General/Conceptual/iCloudDesignGuide/Chapters/Introduction.html- 特别是该部分“为 iCloud 中的文档进行设计” http://developer.apple.com/library/mac/#documentation/General/Conceptual/iCloudDesignGuide/Chapters/DesigningForDocumentsIniCloud.html.

至于你的问题:

  • “存储在云端”的真正含义是什么?

    如果您按照斯坦福大学视频使用 UIManagedDocument,您的应用程序将在添加/编辑/删除数据时上传更改日志。然而,您的设备有一种“iCloud 缓存”,它存储 iCloud 数据并从中访问它(当您离线时,甚至当您的应用程序被删除并重新安装时,您可以访问该文件夹)。如果你NSLogiCloud 文件夹中文档的 URL(您应该使用NSMetadataQuery您可以在设备上本地获取 iCloud 文件的路径,即

    /private/var/mobile/Library/Mobile Documents/<Developer identifier>/<App identifier>/...

    因此,在第一次应用程序启动或每次应用程序启动时访问 iCloud 上的 UI(托管)文档时,您需要考虑很多事情(例如 iCloud 是否可用、您是否有网络连接、.. .)。

    但是,按照视频的方式,您的应用程序沙箱和 iCloud 中不会有单独的文档(当然,您可以在将要创建的文档保存到 iCloud URL 以及应用程序沙箱中的本地 URL 时实现这一点)。

  • 合并变更的需要

    如上所述,您的设备正在保存更改日志,其中包括对文档的添加/编辑/删除。这些更改日志会上传到 iCloud,并由连接到同一 iCloud 帐户的其他设备下载。每个设备都可以使用更改日志重建数据模型的当前状态。这使得 iCloud 极其高效(每次完整上传将花费更长的时间)。关于这些变化的同步过程我还可以参考iCloud设计指南。简而言之,您必须考虑设备每次返回在线模式时同步本地 iCloud 文件夹。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIManagedDocument + iCloud“大图”? 的相关文章

  • 编译托管对象模型时有什么方法可以忽略丢失的反向警告吗?

    标题几乎包含了问题 我们发布了一个应用程序 其数据模型的逆配置不正确 我们在下一个版本中使用新版本的数据模型修复了这些问题 但 Xcode 在编译以前的数据模型版本时仍然显示警告 我不想破坏将文档从旧数据模型迁移到新数据模型的能力 并且我非
  • 核心数据二进制数据允许外部存储崩溃

    我在 iOS 12 0 1 上发生崩溃 日志如下 ImageIO CFDataGetBytes data 0x28539b2f0 size 154262 offset 8 count 8 dst 0x16dbf86f0 External d
  • ios 8 核心数据崩溃

    保存时 CoreData 发生崩溃 2014 09 16 09 51 58 273 My app 2678 105246 Terminating app due to uncaught exception NSInvalidArgument
  • NSSortDescriptor 和多对多关系

    我有两种反对意见 地点和历史项目 我正在尝试获取附加到任何历史记录项目的位置 因此该位置的获取谓词是 history count gt 0 效果很好 我还想使用 NSSortDescriptor 按最新历史项目的日期对位置对象进行排序 据我
  • iCloud 超时。 (使用iCloud + Core Data + Magical Record

    我开始了一个应用程序测试来使用Core Data and iCloud 使用魔法记录 经历了一番配置之后Provisioning Profiles和权利 应用程序终于运行了 一段时间后 应用程序崩溃并抛出此消息 2012 12 31 03
  • 如何提高 iPhone 上的核心数据获取性能?

    Core data在iPhone上的表现绝对是惨不忍睹 索引是完全损坏还是只是一个糟糕的实现 我的核心数据存储 SQLite 后备存储 中有大约 21500 个单一类型的对象 这些对象在 UUID 上建立索引 该 UUID 是一个 NSSt
  • 从一个 NSManagedObjectContext 保存的更改不会反映在主 NSManagedObjectContext 上

    我有一个主NSManagedObjectContext是在appDelegate 现在 我正在使用另一个NSManagedObjectContext用于编辑 添加新对象而不影响主对象NSManagedObjectContext 直到我拯救它
  • UITableView 中的 moveRowAtIndexPath 导致动画不正确

    我有一个简单的 UITableView 控制器 显示 CoreData 我正在尝试实现 void tableView UITableView tableView moveRowAtIndexPath NSIndexPath fromInde
  • CoreData:是否将图像存储到数据库?

    我正在制作一个应用程序 它从网站上为某些用户名拍摄照片 并将其显示在带有用户名的 UITable 中 然后当单击用户名时 它会显示该用户的照片 然后单击照片名称 它会显示全屏照片 我的问题是我正在使用 NSData 从互联网获取照片 我必须
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • 核心数据 iCloud 同步中的关系完整性和验证

    考虑以下简单的实体模型 实体 A 与实体 B 具有一对一关系 称为b 实体 B 具有逆对一关系 称为a 这两种关系都不是可选的 A B b lt gt a 假设我们有两个设备 1 和 2 开始完全同步 每个对象都有一个 A 类对象和一个 B
  • 如何在 UITableView 的 switch 语句中创建变量?

    我正在构建一个包含三个部分的 tableView 我已经完成了前两个工作 但最后一个有点阻力 我的问题似乎涉及尝试在 switch 语句中声明变量 实际上是嵌套的 switch 语句 据我所知 这不是一个好主意 但在这种情况下 这似乎是唯一
  • 核心数据迁移后出现 NSRangeException

    在向我的应用程序添加新的核心数据模型版本后 我执行了轻量级迁移 显然成功了 迁移的文件加载正常 但在第一次尝试通过特定关系访问属性时 应用程序崩溃并显示NSRangeException NSArrayM objectAtIndex inde
  • 将图像存储在核心数据中

    我想在更新记录时存储每位员工的图像 我怎样才能做到这一点 我有一个字典 存储员工的姓名 ID 和部门 现在我想将图像保存在一起 Core Data 支持 二进制数据 类型 当您定义具有二进制数据字段的模型时 它会创建具有 NSData 字段
  • 核心数据实体关系在启动之间不会保存

    我正在编写一个应用程序 它有四个主要实体 它们都通过关系链接 有些是一对一 有些是一对多 初始加载时 三个实体从本地存储的 XML 文件加载数据到应用程序 其中一个实体从 Web 下载 XML 并从中加载数据 当应用程序加载时 它会执行检查
  • 不允许 CREATE 操作

    我正在尝试利用CloudKit在我的 iOS 应用程序中 但是当我尝试为User记录类型 记录类型名为Users 我收到此错误
  • 核心数据的标准化或规范化字符串?

    我观看了一些有关 Core Data 的 WWDC 视频 并计划维护规范化的文本属性 假设我有以下数据 originalString normalizedString lowercase nsker onsker onsker onsker
  • 其他用户之间的 iCloud 共享 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 据我所知 iCloud 就像个人存储 您可以使用自己的 Apple ID 我想问的是 用户是否可以存储例如图像并与其他用户共享 这意味着类
  • 处理核心数据中的重复条目

    我有一个允许用户保存收藏夹的应用程序 我正在使用 Core Data 将收藏夹存储为托管对象 我已经编写了一些代码来防止存储重复项的可能性 但我想知道是否有更好的方法来做到这一点 每个收藏夹对象都有一个唯一的 ID 字段 在下面的代码中 我

随机推荐