【问题标题】:iCloud & Shoebox Apps: How to atomically sync a file package?iCloud 和鞋盒应用程序:如何自动同步文件包?
【发布时间】:2014-01-24 20:20:18
【问题描述】:

我有一个“Shoebox”Mac 应用程序,它带有一个基于 UIDocument 的 iOS 应用程序。

我正在尝试找出通过 iCloud 在 Mac 和 iOS 之间同步数据的最佳策略。

我不能在 Mac 应用程序中采用NSDocument(它是一个鞋盒应用程序,没有类似于 iTunes 中的专辑的单独文档概念)。

我对 Mac 应用的计划是这样的:

  • 将每个项目作为文件包存储在“数据”目录中
  • 使用文件包装器编写包
  • 使用文件协调来同步读/写操作(在文件包的“根”文件夹上同步)

对于 iOS 应用:

  • 将Mac应用在data目录下创建的文件包加载为UIDocuments
  • 依靠 UIDocument 进行更改通知/文件协调
  • 我不会使用Documents 文件夹,因为我不希望用户在“设置”应用中看到文档

我的问题:

  • 如何确保我的 Mac 文件包以一致的方式同步到 iOS? (即,对包中多个文件的更改被原子地视为一次更改)
  • 在目录上设置“文件包”位是否足够(我实际上是通过导出 UTI 来做到这一点的)?
  • 有没有办法实际模拟/测试这个?

【问题讨论】:

    标签: ios macos cocoa icloud nsfilecoordinator


    【解决方案1】:

    在这里,您将进入一个地狱般的世界。在机器之间同步文件包没有灵丹妙药——iCloud 同步掩盖了太多未解决的问题。当你的包中一半的数据文件写出然后用户关闭她的计算机而其余的不写时会发生什么?如果从网络正确读取主索引文件,但网络在它引用的任何数据文件加载之前失败怎么办?

    据我所知,iCloud 没有做任何事情来处理这类问题。

    但是,也就是说,即使使用鞋盒应用程序,我也会(并且确实)使用 NSDocument。让它做你想做的事情并不是很多工作,而且你可以免费获得很多东西。就像,只需从主菜单中删除“打开”和“保存”菜单项,并告诉 NSDocumentController 在应用程序启动时打开您的数据文件。这就是我们所做的。

    【讨论】:

    • 谢谢威尔。我考虑过使用 NSDocument,但这带来了它自己的问题。我发现 NSDocument 中有更多的 UI 代码,例如处理冲突、显示错误消息等。所有这些都使用文档名称,在我的例子中,它是一个对用户没有意义的唯一字符串。此外,我发现在单个 NSWindow 中处理多个文档很棘手。话虽如此,我再给 NSDocument 一个机会。
    • 您应该能够调用 -setDisplayName: 或子类 -displayName 将名称设置为更人性化的名称,例如您的应用程序的名称。
    • 如何处理 UI 中的版本冲突?您使用默认的 NSDocument 警报表还是有办法自定义它?在我的例子中,我可能能够在我的应用程序中 80% 的情况下务实地合并冲突版本,而无需用户交互。
    • 我不做冲突合并。我们放弃了尝试进行网络合并,当您有一个复杂的架构时,这是一个非常困难的问题。
    • 好的,那么如何防止自动 NSDocument 合并冲突解决警报表出现?有没有办法拦截它并以编程方式选择获胜版本? (顺便说一下,感谢您的耐心;)
    猜你喜欢
    • 2011-12-12
    • 2012-08-09
    • 1970-01-01
    • 2011-12-24
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2012-01-21
    相关资源
    最近更新 更多