В зависимости от разрешения изображения, UIImagePNGRepresentation
действительно может быть довольно медленным, как и любая запись в файловую систему.
Вы должны всегда выполнять эти типы операций в асинхронной очереди. Даже если производительность при тестировании кажется достаточно хорошей для вашего приложения, вы все равно должны делать это в асинхронной очереди - вы никогда не знаете, какие другие процессы могут выполняться на устройстве, что может замедлить сохранение, как только ваше приложение в руках пользователей.
Более новые версии iOS делают асинхронное и очень простое сохранение с помощью Grand Central Dispatch (GCD). Шаги:
- Создайте
NSBlockOperation
, который сохраняет изображение
- В блоке завершения операции блока прочитайте изображение с диска и отобразите его. Единственное предостережение: вы должны использовать основную очередь для отображения изображения: все операции пользовательского интерфейса должны выполняться в главном потоке .
- Добавьте операцию блокировки в очередь операций и посмотрите, как она работает!
Вот и все. И вот код:
// Create a block operation with our saves
NSBlockOperation* saveOp = [NSBlockOperation blockOperationWithBlock: ^{
[UIImagePNGRepresentation(image) writeToFile:file atomically:YES];
[UIImagePNGRepresentation(thumbImage) writeToFile:thumbfile atomically:YES];
}];
// Use the completion block to update our UI from the main queue
[saveOp setCompletionBlock:^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
UIImage *image = [UIImage imageWithContentsOfFile:thumbfile];
// TODO: Assign image to imageview
}];
}];
// Kick off the operation, sit back, and relax. Go answer some stackoverflow
// questions or something.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:saveOp];
Как только вы освоитесь с этим шаблоном кода, вы обнаружите, что часто его используете. Это невероятно полезно при генерации больших наборов данных, длительных операций при нагрузке и т. Д. По сути, любая операция, которая делает ваш пользовательский интерфейс в меньшей степени медленным, является хорошим кандидатом для этого кода. Просто помните, что вы ничего не можете сделать с пользовательским интерфейсом, пока не находитесь в основной очереди, а все остальное - торт.