Как заставить UIImageWriteToSavedPhotosAlbum синхронизировать (очищать) буферы? - PullRequest
1 голос
/ 17 сентября 2009

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

Примечание. Эта проблема возникает только на физическом устройстве (iPhone 3Gs / 3.1).

Не удивительно, что моя реализация включает вызов UIImageWriteToSavedPhotosAlbum внутри цикла, который перебирает массив из 12 полных путей к соответствующим файлам изображений (все являются JPEG). Минус детали (например, проверка ошибок, регистрация, необязательные параметры обратного вызова), цикл сводится к:

for ( NSString* path in paths ) {
    image = [UIImage imageWithContentsOfFile:path];
    if (image) {
        [NSThread sleepForTimeInterval:1.0]; // unacceptable
        UIImageWriteToSavedPhotosAlbum(image, ...);
    }
}

Обратите внимание на строку с пометкой «неприемлемо». Почему текущий поток должен спать в течение полной секунды перед каждым вызовом UIImageWriteToSavedPhotosAlbum (image, ...)? Ну, потому что это буквально то, сколько времени требуется iPhoneOS 3.1 (работающему на моем устройстве 3Gs), чтобы приступить к реальной записи буферизованного объекта UIImage в постоянное хранилище, представляющее библиотеку фотографий пользователя! Откуда я это знаю? Что ж, потому что без вызова NSThread sleepForTimeInterval: ни о какой ошибке не сообщалось, даже если только часть из 12 изображений (которые, кажется, изменяются случайным образом между 1 и 9) фактически копируются в библиотеку фотографий. Кроме того, результаты улучшаются с увеличением интервала сна, но, как я обнаружил, интервал должен быть значительно увеличен, прежде чем улучшение станет заметным. Даже при таком высоком значении, как 0,8 секунды, я наблюдал отсутствие файлов после повторных испытаний. За 1 секунду я наблюдал до трех последовательных «правильных» запусков, при которых все файлы полностью передавались, прежде чем терял терпение.

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

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Столкнувшись с той же проблемой, я нашел способ обойти это. Когда вы вызываете UIImageWriteToSavedPhotosAlbum, вы можете передать селектор завершения в качестве аргумента.
Таким образом, нет необходимости вызывать UIImageWriteToSavedPhotosAlbum в цикле. Когда первый вызов полностью завершил сохранение (ваш метод завершения вызывается), продолжайте. Используйте некоторый счетчик для управления процессом.

Вот мой код:

-(IBAction) SaveAllPictures {
            UIImage *the_image;
            if (images_to_photos_album < numberOfPhotos) {
                the_image= [UIImage //get your image here] 
                UIImageWriteToSavedPhotosAlbum(the_image, self, @selector(imageSaved: error: context:), the_image);
            }

            if (images_to_photos_album == numberOfPhotos) {
                the_image= [UIImage //get your image here
                UIImageWriteToSavedPhotosAlbum(the_image, self, @selector(image: didFinishSavingWithError: contextInfo:), the_image);
            }


        }


    -(void) imageSaved: (UIImage *) image error:(NSError *) error context: (void *) contextInfo {

        NSLog(@"image saved, error = %@",error);
        if (!error) {
            images_to_photos_album = images_to_photos_album+1;
            [self SaveAllPictures];
        } else { 
             //handle error here
        }

    }


- (void) image: (UIImage *)image didFinishSavingWithError: (NSError *)error contextInfo: (void *)contextInfo {


    images_to_photos_album =0;

    if (error) {
        // handle error here
    } else {
               // handle success here
    }

}
0 голосов
/ 21 сентября 2009

При быстром поиске на форумах разработчиков в Apple появился следующий пост:

https://devforums.apple.com/message/112119#112119 для полной нити.

Эта ветка подсказывает мне, что не существует безопасного способа программно записать изображение в библиотеку фотографий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...