2012-06-22 15 views
6

jestem pobraniem db SQLite z internetu w moim app iPad. Jeśli piszę go zachodzącego atomically: YES dysku nie mogę go używać od razu, bo mimo że plik istnieje, sqlite twierdzi, że tabele nie istnieją. Jeśli użyję atomically = NO lub opóźnię otwarcie pliku kilka chwil, to nie mam tego problemu.NSData WriteToFile: atomowo: nie od razu zapisać plik

Chyba mógłbym go o to przez ustawienie atomically = NO ale potem znowu tam jest jakaś gwarancja, że ​​cała plik zostały zapisane na dysku zaraz po WriteToFile call? Do tej pory mój db nie jest duża, ale w końcu, plus ja nie wiem, jak długo czekać na innych urządzeniach.

Dokumentacja firmy Apple mówi, że ta metoda zwraca wartość YES, jeśli operacja powiedzie się, ale oczywiście nie uwzględnia "opóźnienia" zapisania pliku.

Każda pomoc jest bardzo doceniana!

EDIT: widzę inni ludzie mają the same problem.

+0

Znalazłem ten wątek przepełnienia stosu, który opisuje atomową zapisywanie pliku: http://stackoverflow.com/questions/2705076/difference-between-writing-to-file-atomically-and-not Co ja” Zgaduję, że próbujesz uzyskać dostęp do pliku, zanim system operacyjny zapisze go w magazynie stałym. Czy jest jakiś powód, dla którego absolutnie trzeba pisać atomowo? –

+0

To było również moje przypuszczenie i próbuję wymyślić sposób obejścia tego. Powodem, dla którego muszę pisać atomowo, jest to, że jeśli z jakiegoś powodu coś się zawiesi, mój główny db zostanie uszkodzony, a moja aplikacja stanie się bezużyteczna. – Julian

+0

Jak się masz pobieranie i pisanie? –

Odpowiedz

1

Według link, operacja będzie albo całkowicie pisać lub nie.

Mając to na uwadze, pisać atomowo w innym wątku, a następnie zrobić coś takiego!

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

[NSThread sleepForTimeInterval:.5]; 

} 
+0

Nick, problem polega na tym, że plik EXISTS, ale zawartość nie jest do niego w pełni napisana, zanim metoda zwróci TAK, więc to rozwiązanie nie zadziała (ale dzięki za pomysł!). – Julian

+0

Czy możesz zablokować połączenie? miejsce podczas zapisywania pliku? Możesz także użyć pętli while i sprawdzić mieszanie zapisywanego pliku w porównaniu do pobranego pliku? –

+0

Jak wykonać połączenie blokujące? Wartość mieszania prawdopodobnie będzie działać, ale myślę, że jest to przesada w przypadku tak powszechnego zadania, jak to (i przy niektórych plikach do pobrania nie kontroluję tego, co zostało wysłane do mnie, więc nie mogę uwzględnić wartości skrótu). Jestem zaskoczony, że nikt nie zgłosił czegoś takiego. – Julian