2017-09-14 124 views
0

延遲加載CoreData關係的正確方法是什麼?延遲加載CoreData關係

說我有一個Project對象和一個ProjectFilter對象,它可能已經存在也可能不存在,這是否會像預期的那樣工作?

- (ProjectFilter *)filter 
{ 
    [self willAccessValueForKey:@"filter"]; 
    ProjectFilter *filter = [self primitiveValueForKey:@"filter"]; 
    [self didAccessValueForKey:@"filter"]; 

    if (!filter) { 
     filter = [NSEntityDescription insertNewObjectForEntityForName:@"ProjectFilter" inManagedObjectContext:self.managedObjectContext]; 
     self.filter = filter; 
    } 
    return filter; 
} 

回答

1

這是一個可怕的想法,你不應該這樣做。

在一個非常簡單的核心數據堆棧中,您可以在主線程上運行一切。但是隨着你的應用程序變得越來越複雜,你幾乎總是需要有背景上下文。如果您有多個上下文同時寫入核心數據,則可能會發生合併衝突。您可以告訴核心數據自動解決合併的衝突 - 但這不是一個好的解決方案,因爲您保證以這種方式丟失數據。所以一個常見的解決方案是隻有一個隊列用於寫入和使用主線程隊列僅用於讀取。

在您的設置中,您隱藏了寫入核心數據的事實。所以簡單地訪問project.filter將導致核心數據寫入。如果您試圖管理何時何地寫入核心數據,開發人員很難將其視爲寫入內容。

即使您的核心數據未使用此設置,開發人員知道他何時寫入核心數據也幾乎總是很重要。寫完後你必須保存。寫完後,您可能需要知道它會影響抓取的結果控制器。寫完後你可以得到合併的衝突。

+0

好點,這會是更好的方法嗎? – trapper

+0

'createFilterPropertyIfNeeded'方法會更好。 –