Вопрос по ios, nsdata – NSData writeToFile: atomically: не сохраняет файл сразу

6

Я загружаю базу данных 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--
Загрузка с AFNetworking и когда это сделано, выполняется блок обратного вызова. Внутри этого блока я использую NSData для записи БД на диск. Загрузка работает нормально, но только написание проблематично. Julian
Я нашел этот поток переполнения стека, который описывает атомарную запись файла:stackoverflow.com/questions/2705076/…  Я предполагаю, что вы пытаетесь получить доступ к файлу до того, как ОС запишет его в постоянное хранилище. Есть ли причина, по которой вы должны писать атомарно? Paul O.
Это тоже было мое предположение, и я пытаюсь найти способ обойти это. Причина, по которой я должен написать атомарно, заключается в том, что если по какой-то причине произойдет сбой, моя основная база данных будет повреждена, что сделает мое приложение непригодным для использования. Julian

Ваш Ответ

1   ответ
1

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

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

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

[NSThread sleepForTimeInterval:.5];

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

Похожие вопросы