2012-06-22 29 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

相关问题