2012-07-03 99 views
0

我想知道實現某個功能的最佳方式。我有一個消息編輯器視圖,用戶創建一個NSManagedObject MessageObject。我也有一個ObjectHelper類,它有一個全局實例初始化。在一個視圖中創建NSManagedObject並保存在另一個視圖中

我有一個背景(私人隊列)NSManagedObjectContext當用戶進入撰寫視圖時立即創建一個MessageObject。這裏的蹊蹺之處是ObjectHelper的ComposerViewController)是這個新對象的所有者 - 它具有很強的參考屬性變量:

ObjectHelper.h:

@property(nonatomic, strong) MessageObject *newObject; 

然後,回到我的ComposeViewController ,我設置了一個計時器,每隔30秒將對象保存到磁盤(這樣可以節省草稿,比如自動保存,以防用戶中斷或應用程序崩潰,數據不會被清除)。

然後,當用戶點擊保存按鈕時,我想確保我在主線程上儘可能少的工作,這樣解除模態視圖動畫變得平滑,並且函數可以快速返回到主視圖控制器。所以我要做的就是創建一個消息對象的所有值的NSDictionary,叫[globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]

這樣做的就是更新一個已經與從詞典中值撰寫視圖的創建之初newObject實例,在後臺線程中執行它。

然後我解散模態。

我有幾個問題在這裏(請回答任何你可以):

  1. 有沒有實行「草案」節能功能,而不是建立在ObjectHelper屬性實例更好的辦法? (之所以在ComposeController以外的類中創建屬性實例,是因爲視圖控制器會在對象上完成後臺工作時關閉,所以如果我將其設置爲實例變量,恐怕會從內存中消失。 )

  2. 該屬性引用應該是弱還是強?我知道一個NSManagedObjectContext不保證保留它的對象,除非(我認爲)這些對象有未決,未保存的更改。

  3. 由於某種原因,在保存之前在[globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]中調用[backgroundMOC obtainPermanentIDsForObjects:self.newObject error:&error]會導致EXC_BAD_ACCESS崩潰。我猜這與我在我的情況下管理記憶的方式有關。

回答

1
  1. 你的方式來保存草稿似乎很細的給我。

    另一種選擇是不保留任何對象中的屬性引用,並通過某個鍵獲取草稿對象,然後將其更新並再次保存。如果你很少保存某些東西或者有很大的東西,這可能是有意義的,但是你現在的方法似乎更適合。

  2. 參考應該很強。你希望它在任何時候都在場,而你想要更新它,並且你需要它的存在,這樣纔有資格獲得強大的。在引用較弱的情況下,該對象可能會被刪除。磁盤上的數據庫中的對象將保留,但您的內存中的表示將被刪除,您不會希望更新一個零引用。

    我不明白爲什麼這可能導致任何內存過度使用或泄漏,它只是一個對象,這不是一個害怕循環引用的情況。

  3. 至於你的崩潰,我很難說,但也許你應該首先在主線程的MOC中獲取ID,然後在後臺MOC中使用它?另外,因爲在線程邊界之間傳輸NSDictionary比在NSManagedObject之間傳輸更容易,所以也許你應該始終將草稿保留在後臺MOC中?

    您在updateNewObjectInstanceWithDictionary:中的代碼將調用背景隊列中的GCD塊並將其傳遞給字典進行保存。

+0

感謝您的回覆。對於第3點,在獲得子ID之前,我不需要首先保存在背景上下文中,後者是主要上下文的子元素嗎?因爲如果我沒有先保存到背景,主要上下文仍然不知道這個新對象,對嗎?至於在任何時候將我的對象留在後臺MOC中,是不是我在做什麼? – Snowman

+0

如果您從後臺MOC創建或獲取草稿對象,那麼是的,這就是您在做的事情:)。那麼我的回答在這一點上是不相關的,我不認爲我有足夠的知識來進一步評論你的崩潰。我總是避免通過線程邊界移動數據,在主線程上保留小對象並僅在後臺保留同步。 – coverback

+0

至於崩潰,如果我用'[backgroundMOC obtainPermanentIDsForObjects:backgroundMOC.managedObjects.allObjects error:&error]'替換'[backgroundMOC obtainPermanentIDsForObjects:self.newObject error:&error]',崩潰就會消失。任何想法這可能意味着什麼? – Snowman

相關問題