gpt4 book ai didi

iphone - 在一个 View 中创建 NSManagedObject 并保存在另一个 View 中

转载 作者:行者123 更新时间:2023-11-29 04:33:51 24 4
gpt4 key购买 nike

我想知道实现特定功能的最佳方法是什么。我有一个消息编辑器 View ,用户在其中创建 NSManagedObject MessageObject .我也有课ObjectHelper其中初始化了一个全局实例。

我有后台(私有(private)队列)NSManagedObjectContext创建 MessageObject当用户进入撰写 View 时立即执行。这里的问题是 ObjectHelper (不是 ComposerViewController)是这个新对象的所有者 - 它有一个具有强引用的属性变量:

ObjectHelper.h:

@property(nonatomic, strong) MessageObject *newObject;

然后,回到我的 ComposeViewController ,我设置了一个计时器,每 30 秒将对象保存到磁盘(这会保存草稿,就像自动保存一样,以防用户因某种原因被中断或应用程序崩溃,数据不会被删除)。

然后,当用户点击保存按钮时,我想确保在主线程上做尽可能少的工作,以便关闭模态视图动画流畅,并且函数快速返回到主视图 Controller 。所以我要做的就是创建一个 NSDictionary使用消息对象的所有值,调用 [globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]

它的作用是更新 newObject实例已在撰写 View 的开头使用字典中的值创建,并在后台线程中执行。

然后我关闭该模式。

我有几个问题(请尽可能回答):

  1. 有没有比在 ObjectHelper 中创建属性实例更好的方法来实现“草稿”保存功能? ? (我在 ComposeController 之外的外部类中创建属性实例的原因是因为 View Controller 在对象上完成后台工作时关闭,所以我担心如果我将其设为实例,它会从内存中消失变量。)

  2. 属性引用应该是弱引用还是强引用?我认识一个NSManagedObjectContext不保证保留其对象,除非(我认为)这些对象有挂起的、未保存的更改。

  3. 由于某种原因,调用[backgroundMOC obtainPermanentIDsForObjects:self.newObject error:&error][globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]保存之前会导致 EXC_BAD_ACCESS 崩溃。我猜这与我在我的情况下管理内存的方式有关。

最佳答案

  1. 我觉得你保存草稿的方式非常好。

    另一个选择是不在任何对象中保留属性引用,并通过某个键获取草稿对象,更新它并再次保存。如果您很少保存某些内容或保存非常大的内容,这可能是有意义的,但您当前的方法似乎更适合。

  2. 引用应该很强。当你想要更新它时,你希望它始终存在,并且你需要它的存在,这样就符合强的条件。如果存在弱引用,该对象可能会被删除。磁盘上数据库中的对象将保留,但内存中的表示将被删除,您不希望这样 - 更新零引用。

    我不明白为什么这可能会导致任何内存过度使用或泄漏,它只是一个对象,这不是害怕循环引用的情况。

  3. 至于你的崩溃,我很难说,但也许你应该先在主线程的MOC中获取ID,然后在后台MOC中使用它?另外,由于在线程边界之间传输 NSDictionary 比在 NSManagedObject 之间传输更容易,也许您应该始终将草稿保留在后台 MOC 中?

    updateNewObjectInstanceWithDictionary: 中的代码将调用后台队列上的 GCD block ,并将其传递给要保存的字典。

关于iphone - 在一个 View 中创建 NSManagedObject 并保存在另一个 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com