2012-06-22 31 views
6

我正在從網上下載SQLite數據庫到我的iPad應用程序。如果我把它寫到磁盤設置atomically: YES我不能立即使用它,因爲即使文件在那裏,sqlite抱怨表不在那裏。如果我使用atomically = NO或者我延遲文件的打開幾個瞬間,那麼我沒有這個問題。NSData writeToFile:原子地:不立即保存文件

我想我可以去了解它通過設置atomically = NO但隨後又是有某種形式的擔保,該將writeToFile右後整個文件已被寫入到磁盤:打電話?到目前爲止,我的分貝並不是那麼大,但它最終還是會加上我不知道在其他設備上等待多久。

Apple文檔說,如果操作成功,則此方法返回YES但顯然不考慮保存文件的「滯後」。

任何幫助,非常感謝!

編輯:我看到其他人有the same problem

+0

我發現,說明原子文件寫入該堆棧溢出線程:http://stackoverflow.com/questions/2705076/difference-between-writing-to-file-atomically-and-not 我」什麼猜測是,你試圖在操作系統把它寫入永久存儲之前訪問該文件。你是否有理由必須以原子方式寫作? –

+0

這也是我的猜測,我試圖找出解決方法。我必須以原子方式編寫的原因是,如果由於某種原因,事件崩潰,我的主分區將損壞,導致我的應用程序無法使用。 – Julian

+0

你是如何下載和寫作? –

回答

1

根據鏈接,操作將完全寫入或失敗。

考慮到這一點,在另一個線程上原子寫入,然後做這樣的事情!

while (![[FileManager defaultFileManager] fileExistsAtPath:yourEventualDBPath]) { 

[NSThread sleepForTimeInterval:.5]; 

} 
+0

尼克,他們的問題是,文件EXISTS,但內容沒有完全寫入它的時候,該方法返回YES,所以這種解決方案將無法正常工作(但感謝這個想法!) – Julian

+0

你可以把一個阻塞呼叫當文件正在寫入時放置?您也可以使用while循環,並檢查正在寫入的文件與下載的文件的哈希值? –

+0

你如何做一個阻塞呼叫?散列可能會起作用,但我認爲這對於這樣一個常見任務來說是過分的(並且在某些下載中,我不控制發送給我的內容,所以我不能包含散列)。我很驚訝沒有人沒有像這樣報道過。 – Julian

相關問題