2013-03-25 97 views
1

我正在創建一個包含潛在數百個大文件的NSDocument程序包,因此我不想在打開文檔時將它全部讀入。NSFileWrapper是否支持延遲加載?

我花了一些時間搜索,但我找不到答案。大多數人似乎認爲NSFileWrapper會將所有數據加載到內存中,但有些人表示在包裝器上調用-regularFileContents之前它不會加載數據。 (參見例子Does NSFileWrapper load everything into memory?Objective-C/Cocoa: Uploading Images, Working Memory, And Storage。)

的文檔並不完全清楚,但像NSFileWrapperReadingImmediateNSFileWrapperReadingWithoutMapping選項似乎表明,它並不總是閱讀一切。

我推測,NSFileWrapper支持增量保存,只寫出已被替換的子包裝。所以如果它也支持增量加載,那將會很好。

是否有確定的答案?

回答

1

NSFileWrapper默認加載延遲,除非您指定NSFileWrapperReadingImmediate選項。它會避免將文件讀入內存,直到實際請求它爲止。

作爲調試援助只有,你可以查看是否有文件被加載,通過檢查:

[wrapper valueForKey:@"_contents"]; 

它被填寫爲NSData一旦文件被從磁盤讀取。

+1

謝謝,非常有幫助。我正確地認爲,如果我指定了'NSFileWrapperReadingWithoutMapping',那麼'-regularFileContents'將在文件中讀取而不緩存它?我希望能夠閱讀一堆plists而不讓他們留在記憶中。更好的辦法是讓它緩存它們,並有辦法在不再需要時卸載/丟棄它們,但我沒有看到任何方法。 – Dejal 2013-04-09 17:34:44

+0

不,'NSFileWrapperReadingWithoutMapping'控制是否使用內存映射。無論哪種方式,覆蓋文件的'NSData'對象將被保存到 – 2013-04-09 23:32:31

+1

「卸載」文件包裝器而不釋放它的唯一方法是讓它再次從URL讀取。可以說這是一種有意的設計,因此在正常情況下,「NSFileWrapper」具有半不可變的性質;一旦加載,其屬性不會回覆到較早/未知狀態 – 2013-04-09 23:35:02