我正在为iOS编写一个使用Web服务提供的数据的应用程序。我正在使用核心数据进行本地存储和数据持久化,以便在无法访问Web时,用户可以使用某些核心数据集。
在构建这个应用程序时,我一直在阅读很多关于核心数据的帖子。虽然这方面的机制似乎有很多,但我对此的一般原则/模式的看法较少。
我想知道是否有一些推荐的互动模型有很好的参考资料。
例如,用户将能够在应用程序上创建新对象。假设用户创建了一个新的员工对象,用户通常会创建它,更新它然后保存它。我已经看到了将这些步骤更新到服务器的建议 - >当用户创建它时,当用户对字段进行更改时。如果用户在最后取消,则会向服务器发送删除。对同一操作的另一个不同建议是将所有内容保存在本地,并且仅在用户保存时将完整更新发送到服务器。
除了这个例子,我很好奇是否有一些关于如何处理CRUD操作的一般建议/模式,并确保它们在webserver和coredata之间同步。
非常感谢。
答案 0 :(得分:1)
我认为在您提到的情况下,最佳方法是仅在本地存储数据,直到用户提交添加新记录为止。将每个字段编辑发送到服务器有点过分。
iPhone应用程序的一般成语是没有“保存”这样的东西。用户通常会期望在某些合理的点上提交事物,但是它不会作为保存本身呈现给用户。
因此,例如,假设您有一个UI,允许用户编辑某种记录,这些记录将保存到本地核心数据并发送到服务器。在用户退出UI以创建新记录时,他们可能会点击一个名为“完成”的按钮(N.B。通常不称为“保存”)。在他们点击“完成”时,您将要启动核心数据写入并开始推送到远程服务器。服务器pus h不一定会占用UI或让它们等到它完成 - 让它们继续使用应用程序更好 - 但它正在发生。如果更新推送到服务器失败,您可能希望向用户发送信号或执行适当的操作。
在计划核心数据和/或远程服务器的写入粒度时要问自己一个很好的问题是:如果应用程序在应用程序的任何特定位置崩溃或手机电量耗尽,会发生什么? ?可能会发生多少数据丢失?好的应用程序降低了数据丢失的风险,并且可以在与出于任何原因退出之后的状态非常相似的状态下重新启动。
答案 1 :(得分:1)
准备好撕掉你的头发。我一直在研究这个问题,问题是核心数据样本非常简单。当您转移到复杂模型并尝试使用NSFetchedResultsController及其委托时,您会遇到使用多个上下文的各种问题。
我使用一个在后台“块”中填充来自您的Web服务的数据,并使用第二个用于表视图 - 您最有可能最终使用tableview查看主列表和详细信息视图。
如果您希望在接收服务器或从服务器发送数据时保持应用程序的响应能力,请在Cocoa中使用块。
答案 2 :(得分:0)
您可能想要了解“交易” - 这基本上是将多个操作/更改分组为单个原子操作/更改。这有助于避免可能导致服务器上的数据不一致的部分保存。
最终,这是一个非常重要的主题 - 特别是如果服务器数据在多个客户端之间共享。最简单的,你想要决定基本政策。最后赢得胜利吗?服务器数据存储中的对象是否存在远程锁定的概念?当两个客户端编辑同一对象的相同属性时,如何解决冲突?
关于如何在iPhone上完成工作,我同意occulus“完成”为持久更改服务器(在单独的线程中)提供了一个自然的点。