Вы должны переместить ваш метод saveImageToCameraRoll
в отдельный поток или, по крайней мере, асинхронно в основном потоке. Затем вы можете отклонить предупреждение и saveAction:
может вернуться до его завершения.
Самый простой способ сделать это - использовать dispatch_async
. Используйте dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
, чтобы получить очередь для отдельного потока, или dispatch_get_main_queue()
для основного потока. Убедитесь, что вы не выполняете никакой работы с пользовательским интерфейсом (или не используете API-интерфейсы, не поддерживающие потоки) в других потоках!
Редактировать: подробнее:
- (IBAction)saveAction:(id)sender {
UIAlertView *alert;
alert = [[[UIAlertView alloc] initWithTitle:@"Saving photo to library\nPlease Wait..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
[alert show];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.center = CGPointMake(alert.bounds.size.width / 2, alert.bounds.size.height - 50);
[indicator startAnimating];
[alert addSubview:indicator];
[indicator release];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Save in the background
[self saveImageToCameraRoll];
dispatch_async(dispatch_get_main_queue(), ^{
// Perform UI functions on the main thread!
[alert dismissWithClickedButtonIndex:0 animated:YES];
});
});
}