2013-11-28 43 views
1

我使用可可綁定來綁定NSTableViewCore Data像下面什麼是自動準備內容和自動重新排列NSArrayController的對象?

_arrayController = [[MyArrayController alloc] init]; 
[_arrayController setEntityName:@"User"]; 
[_arrayController setManagedObjectContext:self.managedObjectContext]; 
[_arrayController setUsesLazyFetching:NO]; 

[self.tableView bind:NSContentBinding toObject:self.arrayController withKeyPath:@"arrangedObjects" options:nil]; 

[_arrayController fetch:nil]; 

,一切似乎運作良好。

但有一點我不明白的是automaticallyPreparesContentautomaticallyRearrangesObjects屬性NSArrayController的影響。根據該文件,默認情況下,這兩者都是NO,我也沒有更改它們。 Doc

如果標誌爲YES和被管理對象的上下文被設置時,使用當前取謂詞初始內容是從被管理對象的上下文中取出。控制器也註冊爲其管理對象上下文的觀察者。然後使用上下文的通知來跟蹤其實體的插入和刪除,並根據需要更新其內容數組。

我認爲這意味着,如果該標誌爲NO,則內容數組不會更新爲新插入的對象到託管對象上下文。但是,當我將新的託管對象插入托管對象上下文時它會更新。我誤解了什麼?

而且,關於automaticallyRearrangesObjectsDoc

把接收機是否自動重新排列其內容對應於當前的排序描述符和過濾謂詞。

這意味着,如果標誌爲NO,即使數組控制器的排序描述符或過濾器謂詞發生更改,內容也不會重新排列。但它是!當我更改過濾器謂詞或排序描述符時,將重新排列綁定到數組控制器的表視圖上的行。

我很困惑我不知道或誤解了NSArrayController的行爲。

回答

2

'自動準備內容'決定是否在CoreData數據庫上自動完成初始提取以填充arrayController,或者您必須自己完成。

如果您想在初始抓取之前進行特殊抓取或在代碼中進行一些額外的設置,您可以關閉它。

'automaticallyRearrangesObjects'決定當您更改對象中的某個值時,arrayController是否會重新排序,而不是在您更改排序或過濾器時是否重新排序。就像,如果你對「標題」進行排序並且你改變了一個對象的標題,你將不得不手動告訴arrayController更新自己,否則它會自動發生。

如果您有成千上萬的行,您可能會關閉後者,因爲在大量項目上設置KVO其實很慢。

+0

如果我禁用「準備內容」,我是否需要編寫代碼或仍然可以使用接口構建來獲取數據? (在我的情況下,NSArrayController綁定到一個NSComboBoxCell) – aneuryzm