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