NSData writeToFile: atomically: не сохраняет файл сразу

Я загружаю базу данных SQLite из Интернета в свое приложение для iPad. Если я напишу это в настройках дискаatomically: YES Я не могу сразу использовать его, потому что, хотя файл есть, sqlite жалуется, что таблиц там нет. Если я используюatomically = NO или я задерживаю открытие файла на несколько мгновений, тогда у меня нет этой проблемы.

Я думаю, я мог бы пойти на это, установивatomically = NO но затем сноваis there some sort of guarantee that the whole file has been written to disk right after the writeToFile: call? Пока что моя база данных не такая большая, но в конечном итоге она будет расти, плюс я не знаю, как долго ждать в других устройствах.

Apple, документы говорят, что этот метод возвращаетYES если операция завершается успешно, но, очевидно, это не учитывает "задержку" Сохранение файла

Любая помощь с благодарностью!

РЕДАКТИРОВАТЬ: я вижу, что другие люди имеютта же проблема.

 ott--22 июн. 2012 г., 22:43
Как вы на самом деле скачиваете и пишете?
 Julian24 июн. 2012 г., 03:01
Загрузка с AFNetworking и когда это сделано, выполняется блок обратного вызова. Внутри этого блока я использую NSData для записи БД на диск. Загрузка работает нормально, но только написание проблематично.
 Julian22 июн. 2012 г., 20:06
Это тоже было мое предположение, и я пытаюсь найти способ обойти это. Причина, по которой я должен написать атомарно, заключается в том, что если по какой-то причине произойдет сбой, моя основная база данных будет повреждена, что сделает мое приложение непригодным для использования.
 Paul O.22 июн. 2012 г., 19:47
Я нашел этот поток переполнения стека, который описывает атомарную запись файла:stackoverflow.com/questions/2705076/…  Я предполагаю, что вы пытаетесь получить доступ к файлу до того, как ОС запишет его в постоянное хранилище. Есть ли причина, по которой вы должны писать атомарно?

Ответы на вопрос(1)

Решение Вопроса

По ссылке операция либо напишет полностью, либо провалится.

Имея это в виду, напишите атомно в другой теме, а затем сделайте что-то вроде этого!

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

[NSThread sleepForTimeInterval:.5];

}
 26 июн. 2012 г., 22:35
Вы можете сделать блокирующий вызов, используяwaitUntilFinished:YES параметр наperformSelector вызов.
 Julian24 июн. 2012 г., 02:31
Ник, проблема в том, что файл СУЩЕСТВУЕТ, но содержимое не полностью записано в него к тому времени, когда метод возвращает ДА, поэтому это решение не сработает (но все равно спасибо за идею!)
 Julian25 июн. 2012 г., 23:44
Как вы делаете блокирующий звонок? Хэш, вероятно, сработает, но я думаю, что он является избыточным для такой распространенной задачи, как эта (и в некоторых загрузках я не контролирую то, что мне отправлено, поэтому я не могу включить хэш). Я удивлен, что никто не сообщил ничего подобного.
 25 июн. 2012 г., 22:46
Можете ли вы сделать блокирующий вызов на месте во время записи файла? Вы также можете использовать цикл while и проверять хеш файла, который записывается, по сравнению с загруженным файлом?

Ваш ответ на вопрос