UIImageWriteToSavedPhotosAlbum работает ... иногда - PullRequest
3 голосов
/ 10 июня 2010

UIImageWriteToSavedPhotosAlbum работает только иногда. Иногда это работает, иногда нет, точно такая же функция.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {
NSLog(@"Saving image to camera roll...");
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
NSLog(@"Done!"); }

Я использую контроллер UIImagePicker для получения изображения, которое затем вызывает эту функцию.

Иногда он сохраняет его в фотоаппарат, а иногда просто нет.

У кого-нибудь есть идеи?

Заранее спасибо.

Edit:

Метод завершения для UIImageWriteToSavedPhotosAlbum иногда возвращает ошибку:

wait_fences: failed to receive reply: 10004003

Ответы [ 2 ]

17 голосов
/ 07 июля 2010

Надеюсь, что этот ответ не слишком поздно, чтобы быть полезным.Я столкнулся с точно такой же проблемой.Как оказалось, проблема двоякая.Во-первых, изображение необходимо сохранить перед отправкой в ​​UIImageWriteToSavedPhotosAlbum.Во-вторых, на устройствах до iPhone4 эта функция может занять много времени.Исправление, которое я нашел, заключалось в реализации функции обратного вызова.Об этом см. Документацию для UIImageWriteToSavedPhotosAlbum.Функция должна быть в правильном формате, вы не можете просто использовать любую старую функцию.В этой функции обязательно освободите изображение, которое вы сохранили, иначе у вас будет утечка памяти.Вы также можете использовать это для отслеживания того, когда изображения будут сохранены.Вот мой основной код ниже:

    -(void)processImage:(UIImage *)image {
        [image retain];
        UIImageWriteToSavedPhotosAlbum(reconstructedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
}


    - (void)image:(UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo {
        NSLog(@"SAVE IMAGE COMPLETE");
        if(error != nil) {
            NSLog(@"ERROR SAVING:%@",[error localizedDescription]);
        }
        [image autorelease];
    }
0 голосов
/ 11 июня 2010

Я бы начал с добавления целевого метода завершения к вызову сохранения, чтобы узнать, не вызывает ли он каких-либо ошибок. Подробнее см. Документацию UIImageWriteToSavedPhotosAlbum.

Edit:

Один раз он вернулся ... wait_fences: не удалось получить ответ: 10004003

Это означает, что время операции истекло. Есть много причин этого:

  1. Недостаточно памяти: введите лог didReceiveMemoryWarning, чтобы увидеть, является ли это причиной.
  2. Поврежденные файлы, которые система не может сохранить. Если изображение генерируется каждый раз, оно может каждый раз получаться неправильным.
  3. Неправильно сообщена ошибка переполнения диска.

Я думаю (1), скорее всего, и объясняет прерывистый характер. Когда у вас достаточно памяти, метод работает, а когда нет - не работает.

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

...