Обнуление ALAssetRepresentation после сохранения изображения, полученного с помощью UIImagePickerController в iOS5 - PullRequest
1 голос
/ 23 марта 2012

В моем приложении (которое работало под iOS 4) я собираю картинки, выбранные с помощью UIImagePickerController . К сожалению, у меня возникла странная проблема после обновления до iOS 5.

В двух словах, я храню ALAssetRepresentation в NSMutableArray . Когда я добавляю фотографии из библиотеки, все в порядке. Однако, когда я снимаю и сохраняю изображение, все ALAssetRepresentations (включая новое) становятся размером 0. ALAssetRepresentation.size и ALAssetRepresentation.getBytes: fromOffset: length: error: return 0 и getBytes: error is nil.

Я инициирую ALAssetsLibrary в AppDelegate , поэтому «Время жизни объектов, которые вы возвращаете из экземпляра библиотеки, связано с временем жизни экземпляра библиотеки». Условие в порядке.

Есть ли способ предотвратить обнуление ALAssetRepresentation? Или как после этого прочитать изображение байтами?

Мой код:

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

if ([picker sourceType] == UIImagePickerControllerSourceTypePhotoLibrary){
    [self addPhoto:[info valueForKey:UIImagePickerControllerReferenceURL]];
}
else if ([picker sourceType] == UIImagePickerControllerSourceTypeCamera){
    [self savePhoto:[info valueForKey:UIImagePickerControllerOriginalImage]];
}

[self dismissModalViewControllerAnimated:YES];
}

-(ALAssetsLibrary*) getLibrary{
if (!library){
    testAppDelegate *appDelegate = (testAppDelegate *)[[UIApplication sharedApplication] delegate];
    library = appDelegate.library;
}

NSLog(@"getLibrary: %@", library);
return library;
}

-(void) addPhoto:(NSURL*) url{
ALAssetsLibraryAssetForURLResultBlock successBlock = ^(ALAsset *asset_){
   ALAssetRepresentation *assetRepresentation = [[asset_ defaultRepresentation] retain];
   [photos addObject: assetRepresentation];
};

ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error){
    NSLog(@"Error: Cannot get image. %@", [error localizedDescription]);
};

 [[self getLibrary] assetForURL:url resultBlock:successBlock failureBlock:failureBlock];
}

- (void)savePhoto:(UIImage *)image {

[[self getLibrary] writeImageToSavedPhotosAlbum:[image CGImage] orientation:[image imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error) {
    if (error) {
        NSLog(@"Error: Cannot save image. %@", [error localizedDescription]);
    } else {
        NSLog(@"photo saved");
        [self addPhoto:assetURL];
    }
}];
}

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Я решил это!

ALAssetsLibraryChangedNotification Отправляется, когда содержимое библиотеки ресурсов изменилось из-под приложения, использующего данные. Получив это уведомление, вы должны отказаться от любой кэшированной информации и снова запросить библиотеку ресурсов. Вы должны считать недействительными любые объекты ALAsset, ALAssetsGroup или ALAssetRepresentation, на которые вы ссылаетесь после завершения обработки уведомления.

0 голосов
/ 23 марта 2012

Вы пытались сохранить ALAssets вместо ALAssetRepresentation?Это должно работать, я использовал этот подход раньше.

...