使用MVVM模式处理NSManagedObjects问题

3
我已经苦思冥想了一段时间,仍无法找到一个好的答案:
在MVVM模式中,如何处理NSManagedObjects作为模型?
我尝试了几种不同的方法:
1. 在ViewModel中保留一个NSManagedObject的副本——虽然这对我来说有点危险,因为可能会出现线程问题 2. 通过一个名为-initWithModel:的方法将NSManagedObject解包到实际使用的属性中——这意味着我在初始初始化后将不再收到任何关于NSManagedObject的更新 3. 保留NSManagedObject的NSManagedObjectID的副本,并针对每个ViewModel实例使用一个NSManagedObjectContext来检索和监视私有NSManagedObject及其属性——这似乎对每个ViewModel实例都太过繁重(并且潜在地非常脆弱)
这些方法都不理想。我在脑海中有个想法,即通过-initWithModel:传递一个初始的NSManagedObject实例,但仅保留NSManagedObjectID,然后监听核心数据保存通知并筛选出与保留对象ID不相关的通知。

出于好奇,您如何在Cocoa中使用MVVM?在我看来,Cocoa框架并不是为视图、视图模型和模型之间的这种松散耦合而设计的。 - Jay
我将NSView/NSViewController视为“视图”,VM只是一个自定义的NSObject子类,而Model往往是NSManagedObjects。这使得我的NSView/NSViewController代码更简洁,非常好用。 - Tony Arnold
1个回答

2

我会做的,但我不确定这是否是最佳实践,就是传入模型,然后将视图模型的属性绑定到(可能映射的)模型属性上。这样你就可以通过视图模型获得更新。它确实留下了一些线程问题,但你可以使用deliverOn:来确保更新始终在主调度程序上交付。


1
我一直使用这种方法,因为没有其他(简单)的方法来获取模型属性的更改。最近,我开始提供一个共享串行调度队列和基于该队列的RACScheduler,我在所有类中使用它来检索、修改和创建我的托管对象——这似乎很有效,但仍需要进行大量的思维运动。谢谢,Ash! - Tony Arnold
Ash: 我想学习MVVM和Core Data。如果您能更新您的答案并提供一些代码以更好地理解您的观点,我将不胜感激。先行致谢。 - salabaha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接