0

我想知道实现某个功能的最佳方式是什么。我有一个消息编写器视图,用户在其中创建一个NSManagedObject MessageObject. 我还有一个ObjectHelper初始化了全局实例的类。

当用户进入撰写视图时,我有一个后台(私人队列)立即NSManagedObjectContext创建一个。MessageObject这里要注意的是ObjectHelper不是ComposerViewController)是这个新对象的所有者——它有一个具有强引用的属性变量:

ObjectHelper.h:

@property(nonatomic, strong) MessageObject *newObject;

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

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

这样做是newObject用字典中的值更新在撰写视图开始时已经创建的实例,并在后台线程中执行此操作。

然后我解雇了模态。

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

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

  2. 属性引用应该是弱还是强?我知道 anNSManagedObjectContext不能保证保留它的对象,除非(我认为)这些对象有待处理的、未保存的更改。

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

4

1 回答 1

1
  1. 你保存草稿的方式对我来说似乎很好。

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

  2. 参考应该是强的。当您想要更新它时,您希望它始终存在,并且您需要它的存在,因此有资格成为强大的。在弱引用的情况下,对象可能会被删除。磁盘上数据库中的对象将保留,但您在内存中的表示将被删除,您不希望这样——更新一个 nil 引用。

    我看不出这可能导致任何内存过度使用或泄漏的任何原因,它只是一个对象,这不是害怕循环引用的情况。

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

    然后,您的代码updateNewObjectInstanceWithDictionary:将在后台队列中调用 GCD 块并将其传递给字典以保存。

于 2012-07-03T19:28:33.757 回答