2013-02-14 116 views
5

一些背景資料:需要對refreshObject一些澄清:mergeChanges:YES

我試圖存儲大量本地DB數據的,我想盡可能高效地做到這一點。

場景:

有許多實體它們是相互關聯的,如地址與像這樣的聯繫人相關聯:

地址< < - >接觸

爲了管理關係,我在NSManagedObject的每個子類中都寫了一個方法,下面是一些代碼片段:

// class Contact 
- (void)manageRelationships 
{ 
    @autoreleasepool { 
     LocalDBManager *localDBManager = [[LocalDBManager alloc] init]; 

     // managing relationships 

     // map associated addresses 

     NSPredicate *addressIdPredicate = [NSPredicate predicateWithFormat:@"%K == %@",ADDRESSID,self.addressid]; 

     // below method returns an object as fault by firing a fetch request against context 
     NSSet *retrievedAddresses = [localDBManager retrieveManagedObjectsForEntity:ADDR_ENTITY withPredicate:addressIdPredicate asFault:YES withPropertyValues:NO error:nil]; 
     self.addresses = retrievedAddresses; 


     // managing few more relationships   
    } 

} 

角度來考慮:

既然可以有一個對象的多重關係,我知道,內存消耗將增加的時候我會映射關係。

問:

我想回頭對象插入故障,而不會丟失所作的任何更改,一旦關係映射。

從蘋果文檔和一些谷歌搜索我來知道,我可以使用refreshObject:mergeChanges:方法。所以我打算在manageRelationships方法在代碼塊的結束下面一行添加:

[[self managedObjectContext] refreshObject:self mergeChanges:YES]; 

我有點困惑,想知道 -

這是否意味着任何變化,以製造該對象將被存儲在永久存儲中的 ,然後該對象將變成故障? 如果是的話,那麼我可以認爲這相當於節省 方法的NSManagedObjectContext

請建議。

+0

得到相同的問題!你有沒有發現這種情況下的解決方案? – Bucket 2018-01-18 08:04:01

回答

11

首先你不需要自己管理關係。讓CoreData處理它。

核心數據在訪問故障中的數據時自動解決(觸發)故障。相關對象的這種延遲加載對於內存使用來說要好得多,並且對於獲取與很少使用的對象(或非常大的對象)相關的對象要快得多。 CoreData performance

您可以通過聯繫地址之間的簡單實例化一個一對多的關係,做到這一點。

關於refreshObject:mergeChanges:你錯了。這不等同於save:方法。如果設置合併變爲是它只是意味着:

如果標誌爲是,則對象的屬性值從值重新加載從商店或最後緩存的狀態,那麼所做的(在當地的任何變化上下文)被重新應用於那些(現在是新更新的)值。 Cocoa touch Doc

所以,如果你沒有在管理對象的一些變化,然後做[背景refreshObject:一mergeChanges:YES]比對象A仍然會保持在一個未保存的狀態。

+0

嗨Mark .. thnx澄清:-) – Devarshi 2013-02-14 09:43:45