2012-06-21 4 views
2

Я пишу приложение для iPhone, которое позволяет просматривать изображения в одном представлении и создавать их в другом.NSData writeToFile не полностью написан при чтении

мнение, что создает изображение будет записать образ документов.Папка, используя следующий код (при касании кнопки, чтобы закрыть вид):

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 

Вид браузер будет загружать изображения с помощью:

UIImage *image = [UIImage imageWithContentsOfFile:path]; 

Теперь это работает отлично 9 из 10 раз. 1 из 10 изображение не написано полностью, прежде чем загружать его, чтобы нижняя половина была черной. Все будет записано в конце концов - если я перезагружу изображение в браузере, будет показано полное изображение. Я думал, что эти вещи всегда будут согласованы внутри одного потока.

Могу ли я сделать что-то, чтобы предотвратить такое поведение?

Прямо сейчас я собираюсь передать вновь созданное изображение обратно в браузер, но это похоже на хак, поскольку браузер показывает все ваши ранее созданные изображения.

+0

Вы можете показать **, который ** метод вызывает 'writeToFile: atomically:'? это обработчик нажатия кнопки, или 'viewWillDisappear:' или что-то еще? вы проверили возвращаемое значение 'writeToFile:'? можете ли вы попробовать другой вариант 'writeToFile:', который позволяет вам передать «NSError»? – Nate

+0

Изображение сохраняется при нажатии кнопки, после чего отклоняется представление. Изображения загружаются в viewDidLoad в режиме просмотра браузера. На самом деле, трудно воспроизвести, я думаю, что это больше похоже на 1/100 или 1/1000. Я видел это 3-4 раза вчера. Боюсь, хватит беспокоиться. Кажется, это не происходит сейчас, когда я перехожу назад и вперед. – rasmus

+0

Кроме того, я видел это на нескольких устройствах (4S, 3GS, iPad). – rasmus

ответ

2

Если вы уверены, что изображение сохраняется в главном (UI) потоке с writeToFile:atomically:, и изображение загружается также в основной поток, то похоже, что существует проблема с этим методом, поддерживающим его контракт для завершения операции к моменту возврата вызова. У iOS иногда есть ошибки, и, возможно, вы их нашли.

Я также отметить, что один из возможных способов, которые я видел подобные проблемы возникают, когда assumptions are made about the order, в котором viewWillAppear, viewDidDisappear и т.д. называется при выходе одного представления для отображения другого. Таким образом, я также должен убедиться, что изображение не сохраняется в одном из этих методов.

Поскольку вы сказали, что проблема показывает изображение , половина видно, я бы предположил, что это не тот случай, но я включаю предупреждение для кого-то другого с аналогичной проблемой с порядком операций.

1

Стандартное решение для процесса, не заканчивающегося для пользовательского интерфейса, состоит в том, чтобы разбить его на новый поток. Возможно, вам нужно создать отдельный поток, чтобы сохранить изображение, а затем уведомить пользовательский интерфейс через метод делегата, чтобы обновить его.

+0

Это не поможет, потому что теперь он выполняется в основном потоке, поэтому операция будет завершена до появления нового представления. – rasmus

+0

@rasmus, если есть какой-либо значительный объем работы (и должно быть, если вы не видите файлы, надежно записанные вовремя), тогда вы должны выполнять эту работу (сохранение) в фоновом потоке. Вы не должны делать все в потоке пользовательского интерфейса как попытку принудительного последовательного выполнения. Пользователям не нравятся замороженные пользовательские интерфейсы. – Nate

+0

@Nate Ну, может быть, не задержка, это не моя проблема, так что это тоже не решение моей проблемы. Пожалуйста, прочитайте вопрос еще раз. Кроме того, задержка не является существенной в этом случае. Проблема заключается не в производительности/задержке, а в правильности. Новый поток не исправит это. – rasmus

Смежные вопросы