我想知道實現某個功能的最佳方式。我有一個消息編輯器視圖,用戶創建一個NSManagedObject MessageObject
。我也有一個ObjectHelper
類,它有一個全局實例初始化。在一個視圖中創建NSManagedObject並保存在另一個視圖中
我有一個背景(私人隊列)NSManagedObjectContext
當用戶進入撰寫視圖時立即創建一個MessageObject
。這裏的蹊蹺之處是ObjectHelper
(不的ComposerViewController)是這個新對象的所有者 - 它具有很強的參考屬性變量:
ObjectHelper.h:
@property(nonatomic, strong) MessageObject *newObject;
然後,回到我的ComposeViewController
,我設置了一個計時器,每隔30秒將對象保存到磁盤(這樣可以節省草稿,比如自動保存,以防用戶中斷或應用程序崩潰,數據不會被清除)。
然後,當用戶點擊保存按鈕時,我想確保我在主線程上儘可能少的工作,這樣解除模態視圖動畫變得平滑,並且函數可以快速返回到主視圖控制器。所以我要做的就是創建一個消息對象的所有值的NSDictionary
,叫[globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]
這樣做的就是更新一個已經與從詞典中值撰寫視圖的創建之初newObject
實例,在後臺線程中執行它。
然後我解散模態。
我有幾個問題在這裏(請回答任何你可以):
有沒有實行「草案」節能功能,而不是建立在
ObjectHelper
屬性實例更好的辦法? (之所以在ComposeController
以外的類中創建屬性實例,是因爲視圖控制器會在對象上完成後臺工作時關閉,所以如果我將其設置爲實例變量,恐怕會從內存中消失。 )該屬性引用應該是弱還是強?我知道一個
NSManagedObjectContext
不保證保留它的對象,除非(我認爲)這些對象有未決,未保存的更改。由於某種原因,在保存之前在
[globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]
中調用[backgroundMOC obtainPermanentIDsForObjects:self.newObject error:&error]
會導致EXC_BAD_ACCESS崩潰。我猜這與我在我的情況下管理記憶的方式有關。
感謝您的回覆。對於第3點,在獲得子ID之前,我不需要首先保存在背景上下文中,後者是主要上下文的子元素嗎?因爲如果我沒有先保存到背景,主要上下文仍然不知道這個新對象,對嗎?至於在任何時候將我的對象留在後臺MOC中,是不是我在做什麼? – Snowman
如果您從後臺MOC創建或獲取草稿對象,那麼是的,這就是您在做的事情:)。那麼我的回答在這一點上是不相關的,我不認爲我有足夠的知識來進一步評論你的崩潰。我總是避免通過線程邊界移動數據,在主線程上保留小對象並僅在後臺保留同步。 – coverback
至於崩潰,如果我用'[backgroundMOC obtainPermanentIDsForObjects:backgroundMOC.managedObjects.allObjects error:&error]'替換'[backgroundMOC obtainPermanentIDsForObjects:self.newObject error:&error]',崩潰就會消失。任何想法這可能意味着什麼? – Snowman