2012-07-09 40 views
0

問題:使用AddingManagedObjectContext的kludgy?有沒有更好的方法:我使用AddingManagedObjectContext?

該應用程序是Universal Library Style CoreData。 RootTableView具有書目類別列表,小說,科幻等 通過EditButton在第二層BookListTableView上添加一本書,然後出現一個新出現的「+」按鈕。第三級顯示書籍詳細信息tableview。

當用戶觸摸第二級「書目」視圖中的「+」按鈕,他已經 已經指出,這本書應該有預設剛上 家BookCategoryList視圖中選擇的類別。新書將成爲主MOC中未知的對象,並在插入操作開始時放置在添加MOC中。我發現,如果我將用戶所需的類別(例如Sci-Fi)從主MOC添加到添加MOC中,則在保存時會出現 錯誤,因爲據我所知,ManagedObject不能存在於兩個不同的MOC中。

因爲我想爲了方便用戶執行這個類別添加,所以我通過 下面的工作。我用同樣的 類別名稱的新替身類別,並增加了新的圖書的財產:

@property (nonatomic, retain) NSSet* categories; 

,從而允許在編輯模式下的圖書詳細信息表視圖來顯示待機動名在類別對象中。然後,當用戶觸摸保存按鈕,只是之前:

[self.addingManagedObjectContext save:&error] 

使用的objectID的,我取出待用從新書類別,然後從addingManagedObjectContext去掉自己一樣 。

按照此addingMOC節省經由:

NSNotificationCenter * DNC = [NSNotificationCenter defaultCenter]; [dnc addObserver:self selector:@selector(addControllerContextDidSave :) name:NSManagedObjectContextDidSaveNotification object: self.addingManagedObjectContext];

新書(不分類)的addingMOC合併到mainMOC

然後我插入mainMOC的相應類別的新書 然後保存mainMOC完成saveAction。

這適用於我,但它感覺尷尬。有人可以解釋我錯在哪裏 和我失蹤了嗎?什麼是正確和優雅的可可方式來處理這個問題?

謝謝,馬克

回答

1

管理對象可以在一個以上的被管理對象的上下文存在,或更精確地表示給定實體的同一實例可以在一個以上的上下文存在管理對象。

當您直接將託管對象實例從一個上下文傳遞到另一個上下文時,特別是在找到您已經找到的線程邊界時,會出現問題。

「傳遞」管理對象的正確方法是通過objectId而不是例如

//Context 1 
NSManagedObjectID *objectID = myObjectInContext1.objectID; 

//Context 2 
NSManagedObject *myObjectInContext2 = [self.managedObjectContext2 objectWithID:objectID]; 

或者你也可以從第二上下文中的持久性存儲,它會給你有效的類別對象重新獲取的類別,然後通過一些其他的值表示要使用的這些對象的例如類別ID或標題。

+0

非常感謝。 – mbarron 2012-07-10 03:17:21

+0

再次感謝。我剛剛刪除了許多無用和混淆的代碼。我很高興有專家像你願意伸出援助之手。 – mbarron 2012-07-10 14:39:54

+0

如果我是專家,我們都註定要失敗!我剛剛閱讀了太多的核心數據資料,試圖讓我的頭腦完整。很高興能夠提供幫助,我從堆棧溢出中獲得了很多幫助。 – 2012-07-10 15:23:07

相關問題