在具有 VIPER 架构的应用程序上更新 NSManagedObject

Posted

技术标签:

【中文标题】在具有 VIPER 架构的应用程序上更新 NSManagedObject【英文标题】:Update NSManagedObject on a app with VIPER architecture 【发布时间】:2016-04-14 17:36:23 【问题描述】:

在执行 VIPER 架构的应用上,建议使用 NSObject 而不是 NSManagedObject(交互器)来处理实体。因此 NSManagedObject 在 PONSO 中被“转换”以使用。 问题是,如果我修改了 PONSO 中的属性,我该如何更新 Core Data?

谢谢。

【问题讨论】:

【参考方案1】:

只需使用NSManagedObject 而不是NSObject。这个建议不能从字面上理解。无论如何,NSManagedObjectNSObject 的直接后代,因此对于所有实际用途来说,它都一样好。

顺便说一句,VIPER 是一种通用的架构理念,由于其文件和功能的粒度过大而没有得到太多关注。我建议您通过围绕这些控制器更有效地构建代码来减少“大规模视图控制器”问题,并使用 VIPER 作为灵感的良好来源。

【讨论】:

这不是一个好主意,因为 VIPER 背后的想法之一是将数据持久性实现与应用程序的其余部分分开。如果你现在开始传递 NSManagedObjects,你的所有代码都依赖于 CoreData,你也会遇到@Arkadi 提到的问题 只有@Arkadi 是错误的。 Core Data 线程安全的,因为它是 ios 上的 de facto 持久性标准,我建议的解决方案不会妨碍关注点分离,同时利用 Apple 的 API 来简化和提高性能. 我最近非常频繁地使用 CoreData,我可以确保 CoreData 在错误的线程上使用时仍然偶尔崩溃;偶尔我的意思是崩溃发生在百万分之一的操作中,但它们确实发生了。因此,您需要将每个操作包装在同步执行块中。此外,即使 CoreData 很棒,另一种数据库解决方案也可能是合适的;尤其是在需要同步到 android 或 Windows 时。【参考方案2】:

这是一个非常糟糕的主意。如果您在应用程序中使用任何异步代码元素并且我们大多数人都这样做,您应该知道 nsmanagedoject 不是线程安全的传递。你需要重新考虑你的方法。如果您使用核心数据支持的应用程序,那么您可以将 managedobjectid 存储在 ponso 中并使用它来更新数据库,同时在数据库更改后触发 ui 刷新

【讨论】:

以上是关于在具有 VIPER 架构的应用程序上更新 NSManagedObject的主要内容,如果未能解决你的问题,请参考以下文章

iOS VIPER架构

iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

iOS架构模式--解密 MVC,MVP,MVVM以及VIPER架构

VIPER 架构

iOS VIPER架构

VIPER中UITableView委托和数据源的实现