2015-06-19 81 views
3

我有一個應用程序使用NSFileWrapper來創建用戶數據的備份。該備份文件包含文本和媒體文件(這裏壓縮不相關)。有時這些備份文件會變得非常大,超過200 MB的大小。當我打電話NSFileWrapper -writeToURL...它似乎全部內容加載到內存中的寫入過程的一部分。在較舊的設備上,這會導致我的應用因系統內存限制而被系統終止。如何避免讓NSFileWrapper在寫入文件時使用大量內存

是否有一種簡單的方法可以避免讓所有內容都被加載到內存中?我已經通讀了我在這裏可以找到的每個NSFileWrapper問題。有關如何解決這個問題的任何建議?

下面是備份文件的當前文件結構:

BackupContents.backupxyz user.txt - folder1 - audio files asdf.caf asdf2.caf - folder2 - audio files asdf3.caf

再次,請不要告訴我壓縮我的音頻文件。這隻會是一個有缺陷的設計的創可貼。

看來我可以使用NSFileManager將所有文件移動/複製到一個目錄中,然後將該目錄設置爲一個包。我應該走這條路嗎?

+2

你嘗試壓縮音頻文件? –

回答

3

NSFileWrapper樹被寫入到磁盤,它會嘗試執行原始文件的硬鏈接到新的位置,但前提是你提供的originalContentsURL的參數。

聽起來你正在編程構造文件包裝(對於備份場景),所以你的文件可能分散在整個文件系統中。這意味着當你writeToURL,你不originalContentsURL。這意味着硬鏈接邏輯將被跳過,並且文件將被加載,以便它可以被重寫。

所以,如果你想要硬鏈接的行爲,你需要找到一種方法來提供一個originalContentsURL。這是最容易通過提供適當的URL初始writeToURL調用來完成。

或者,您可以嘗試繼承常規文件的子類NSFileWrapper,並給它們內部掛上的NSURL。你需要重寫writeToURL通過這個新的URL高達super,但URL應該足以觸發硬鏈接的代碼。你會希望再使用的NSFileWrapper對於大文件這個子類你想硬鏈接到的地方。

+0

巧合的是,我能夠通過簡單地提供我的應用程序的'NSDocumentDirectory'作爲'writeToURL的'originalContentsURL'來解決我的問題...'。這在這個實例中起作用,因爲我的所有子文件包裝指向該目錄中的項目。然而,這個答案更強大,因爲它可以處理我的情況,同時也處理你從不同血統的目錄中提取文件的情況。 –

相關問題