为预览目的创建一个假的 NSManagedObjectContext?

Posted

技术标签:

【中文标题】为预览目的创建一个假的 NSManagedObjectContext?【英文标题】:Create a fake NSManagedObjectContext for preview purposes? 【发布时间】:2021-07-30 06:34:52 【问题描述】:

我希望显示一个“假”预览NSManagedObject 作为示例。但是,我不想让它弄乱我的常规上下文。以下是我假设可行的方法:

创建一个新的NSManagedObjectContext 并将预览NSManagedObject 存储在那里

let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
let person = Person(moc, "Person Name")

在这种情况下,新的上下文会发生什么?如果没有调用save() 并且视图被删除,它会慢慢填满存储空间还是会被删除?

离开视图时删除新创建的NSManagedObject

 SomeView()
 .onDisappear() 
     moc.delete(person)
     PersistenceController.shared.save()
 

如果 .onDisappear() 函数没有被调用,这可能不起作用,例如当用户在该特定视图仍处于打​​开状态时离开应用程序。

将伪造的预览NSMangagedObject 添加到常规上下文中并在其他任何地方过滤掉它(可能是最糟糕的想法)

仅为伪造的NSManagedObjects 创建一个新的全局上下文

不确定这些选项中哪个最好,或者是否有更好的方法我没有想到。谢谢:)

【问题讨论】:

更好的解决方案是让你的持久化存储只存在于内存中,这样当应用程序终止时,创建的任何对象都将被删除。如果您在 Xcode 中创建新的核心数据项目,则生成的持久性控制器类中会内置对此的支持 @JoakimDanielson 我会这样做的,谢谢:) 【参考方案1】:

按照 Joakim Danielson 在 cmets 中的建议,我在内存中创建了一个新的 PersistenceController,但是将它与我​​的其他上下文一起使用会导致崩溃和错误消息。但是,只需创建一个新的 NSManagedObjectContext 就可以了。

它也没有保存到我的“真实”上下文中(Apple 文档):

对托管的更改 对象被保存在内存中,在关联的上下文中,直到 上下文被保存到一个或多个持久存储中

let tempMoc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

用法

let person = Person(tempMoc, "Person Name")

【讨论】:

最好将任何改变模型数据、操作它、获取它的代码或任何不是函数的代码移动到视图模型中并让视图呈现只是普通(恒定)数据。用户的动作可以通过发送 actions 到视图模型(它们只是由父级初始化的函数值)来实现。模拟 ViewModel 并在那里进行依赖注入不仅容易得多,而且是唯一应该这样做的地方。

以上是关于为预览目的创建一个假的 NSManagedObjectContext?的主要内容,如果未能解决你的问题,请参考以下文章

创建假的wifi热点

NodeJS:如何为测试服务器创建一个假的 tcp 套接字

更新时未在返回的实体上设置标记为可更新 = 假的弹簧数据审核字段

使用 Python为你的在线会议创建一个假的摄像头

啥是伪代码?假的代码??是代码吗??

占位符可见总是假的