2012-08-02 90 views
5

我試圖創建一個臨時的託管對象上下文,並在用戶放入信息的幾個屏幕後,我將該上下文與主上下文合併(以確保沒有「不完整」對象被插入)。這是我創造我臨時的上下文,我怎麼插入一個對象:NSManagedObject的managedObjectContext屬性爲零

if (!self.someManagedObject) { 

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]]; 
    NSPersistentStoreCoordinator *storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; 
    [storeCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:nil]; 

    NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [managedObjectContext setPersistentStoreCoordinator:storeCoordinator]; 

    self.someManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SomeObject" inManagedObjectContext:managedObjectContext]; 
    NSLog(@"%@", self.someManagedObject.managedObjectContext); 
} 

這是viewDidLoad的一部分。在控制檯中,它顯示託管對象上下文有一個值。

然而,在此之後右if語句(即使在viewDidLoadself.someManagedObject.managedObjectContext是零。我可以看到爲什麼局部變量將不再提供(它只是超出範圍),但被管理對象的屬性應該還是設置吧?

我知道我可以創建一個用於存儲管理對象上下文的屬性,但我寧願讓它以這種方式工作。

+0

是'someObject'與'someManagedObject'相同嗎? – aforaudrey 2012-08-02 23:04:17

+0

哎呀,是的。我先放了'someObject',但後來想澄清它是一個NSManagedObject。 – 2012-08-02 23:35:01

+0

你已經檢查過'self.someManagedObject'是否爲非零?假設'insertNewObject ...'失敗或者你的屬性是特殊的,那將解釋你所看到的。 – Tommy 2012-08-02 23:44:47

回答

15

我最近遇到了同樣的問題又來了,雖然它是在一個不同的情況。我需要一個臨時的管理對象上下文,與主要對象完全分開,但我又遇到了它在超出範圍後消失的問題。這次我決定進一步調查,最終我意識到managedObjectContext不是NSManagedObject的財產,而是一種方法。這意味着兩件事情之一:

  1. 如果它使用一個屬性在底層實現,該屬性will not hold a strong reference上下文
  2. 如果被管理對象上下文以其他方式得到的,它也不會舉行強烈地提到這種情況。

在這兩種情況下,上下文沒有強引用,超出範圍,和NSManagedObject■找一個nilmanagedObjectContext

解決方案是通過爲它創建一個強大的屬性來簡單地保持上下文。

+0

你知道這是爲什麼嗎? (我有一個單獨的SO [問題](http://stackoverflow.com/q/23687160/1108362))...) – jsadler 2014-05-15 19:36:21

-2

我不明白你爲什麼會需要第二個管理對象上下文恕我直言,你正在爲你的應用程序引入複雜的功能,而不是用於任何特定的用途。

將新對象插入主要上下文中。讓用戶輸入他的數據。如果他打破了,只需撥打

[managedObjectContext rollback]; 

,或者,如果用戶完成所有的數據進行驗證,調用

[managedObjectContext save:nil]; 
+0

這似乎也是一個很好的解決方案,但是'rollback'離多遠呢?到最後保存?我有點依賴於自動保存,所以我不得不手動地調用'save'然後(這不是問題,但我必須知道)。 – 2012-08-04 18:08:34

+0

最後一次保存 - 可能比這更復雜一點,但只能在特殊情況下使用。 - 另外,我不知道「自動保存」。當然最好明確地做。 – Mundi 2012-08-04 20:08:24

+0

我這樣做有一個問題:我必須檢查所有可能的方式,用戶可以避免填寫所有信息。而不是檢查用戶是否做了「錯誤」(如過程中斷),我希望能夠在流程完成時保存。通過這個過程,我的意思是「瀏覽用戶輸入信息的屏幕」。我不希望每一次可能的中斷都要調用'rollback'。 – 2012-08-06 16:48:28

相關問題