我想知道实现某个功能的最佳方法是什么。我有一个消息编辑器视图,用户在其中创建NSManagedObject MessageObject
。我还有一个类ObjectHelper
,它初始化了一个全局实例。
我有一个后台(私人队列)NSManagedObjectContext
当用户进入撰写视图时立即创建MessageObject
。这里的问题是ObjectHelper
(不是 ComposerViewController)是这个新对象的所有者 - 它有一个带有强引用的属性变量:
ObjectHelper.h:
@property(nonatomic, strong) MessageObject *newObject;
然后,在我的ComposeViewController
中,我设置了一个计时器,每隔30秒将对象保存到磁盘(这会保存草稿,如自动保存,以防用户以某种方式中断或应用程序崩溃,数据没有消失。)
然后,当用户点击保存按钮时,我想确保我在主线程上做尽可能少的工作,以便关闭模态视图动画是平滑的,并且函数快速返回到主视图控制器。所以我要做的是创建一个包含消息对象所有值的NSDictionary
,调用[globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]
这样做是使用字典中的值更新已在撰写视图开头创建的newObject
实例,并在后台线程中进行。
然后我解雇了模态。
我在这里有几个问题(请尽可能回答):
有没有更好的方法来实现“草稿”保存功能,而不是在ObjectHelper
中创建属性实例? (我在ComposeController
以外的外部类中创建属性实例的原因是因为视图控制器在对象上进行后台工作时解散,所以我担心如果我做它就会从内存中消失实例变量。)
财产参考应该是弱还是强?我知道NSManagedObjectContext
无法保证保留其对象,除非(我认为)这些对象具有待处理的未保存更改。
出于某种原因,在保存之前调用[backgroundMOC obtainPermanentIDsForObjects:self.newObject error:&error]
中的[globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]
会导致EXC_BAD_ACCESS崩溃。我猜这与我在我的情况下管理记忆的方式有关。
答案 0 :(得分:1)
你保存草稿的方式对我来说似乎很好。
另一个选择是不要在任何对象中保留属性引用,并通过某个键获取草稿对象,更新它并再次保存。如果你很少保存或者有很大的东西,这可能是有意义的,但你现在的方法看起来更合适。
参考应该很强。您希望它在您想要更新时始终存在,并且您需要它存在,以便有资格获得强大。在弱引用的情况下,对象可能会被删除。磁盘上数据库中的对象将保留,但您的内存中表示将被删除,您不希望更新nil引用。
我没有看到任何可能导致任何内存过度使用或泄漏的原因,它只是一个对象,这不是一个害怕循环引用的情况。
至于你的崩溃,我很难说,但也许你应该首先在主线程的MOC中获取ID,然后在后台MOC中使用它?此外,由于在线程边界而不是NSDictionary
之间传输NSManagedObject
更容易,您可能应该始终将草稿保留在后台MOC中吗?
然后updateNewObjectInstanceWithDictionary:
中的代码将调用后台队列中的GCD块并将其传递给字典进行保存。