2011-10-08 100 views
2

我有一個使用CoreData的Mac(不是文檔)應用程序。CoreData完成從磁盤讀取數據時是否有通知?

啓動應用程序時,它讀取存儲在文件系統中的數據。

我必須在- (void)applicationDidFinishLaunching基於使用CoreData存儲的信息設置一些東西。

所以很高興知道我的應用何時從磁盤讀取所有內容。

如果我在上做了我的設置 - (void)applicationDidFinishLaunching我不工作。如果幾秒鐘後我做到了,它就可以工作!

Thx!

+0

什麼是unarchiving?你在使用對象控制器嗎? – paulmelnikow

+0

unarchives可能是錯誤的詞。我用「讀取」替換它。是的,我使用ArrayControllers – Daniel

回答

1

如果您使用的是自動準備自己內容的對象控制器,您可以觀察arrangedObjects以瞭解他們何時提取其內容。這並不能保證實際的物體不是故障。事實上,這是Core Data的主要優勢之一:對象從磁盤中延遲加載。

如果您由於某種原因想要確保大多數磁盤活動都發生在applicationDidFinishLaunching中,則可以執行自定義提取,該提取不會將對象作爲故障返回。在覈心數據文檔中查找「預取」。但是,不能保證Core Data不會因爲內存限制而在稍後時間對這些對象進行錯誤處理,從而導致在再次加載這些對象時引發另一個磁盤讀取。

您當然也可以使用NSBinaryStoreType,在這種情況下,整個商店在被添加到持久性商店協調人時被同步加載到內存中。

+0

非常感謝!我試圖通過這種方式觀察arrangeObjects:'[myArrayController addObserver:self forKeyPath:@「arrangedObjects」options:NSKeyValueObservingOptionNew context:NULL]; (@「test」);} - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)對象更改:(NSDictionary *)更改上下文:(void *)上下文 NSLog(@「test」); }' 但是該方法沒有被調用。我究竟做錯了什麼? – Daniel

+1

當您調用addObserver時,myArrayController是否爲非零? – paulmelnikow

+0

@noa不,它是零。我在AppController的init方法中添加了觀察者。現在我在'applicationDidFinishLaunching'中使用它,它工作正常。謝謝! :) – Daniel