2015-05-12 3 views
10

Я использую UIImagePickerController в двух случаяхКак получить URL изображения добавленного в PHPhotoLibrary

  • выбрать существующее изображение в библиотеке фотографий
  • принять новую картину

в первом случае, когда я выбираю изображение формирует библиотеку, я могу легко получить URL в методе делегата:

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    // Get the URL 
    NSURL *url = [info valueForKey:UIImagePickerControllerReferenceURL]; 
    ... 
} 

Но когда я беру новое изображение, изображение еще не находится в библиотеке фотографий и еще не имеет URL. Поэтому мне сначала нужно добавить изображение в библиотеку. Но тогда, как получить URL-адрес нового актива?

Вот мой код, чтобы добавить изображение в библиотеке фотографий

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    // Get the image 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

    // Add the image in the library 
    [[PHPhotoLibrary sharedPhotoLibrary] 

     performChanges:^ 
     { 
      // Request creating an asset from the image. 
      PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

      // Get the URL of the new asset here ? 
      ... 
     } 

     completionHandler:^(BOOL success, NSError *error) 
     { 
      if (!success) { ...; return; } 

      // Get the URL of the new asset here ? 
      ... 
     } 
    ]; 
} 

ответ

4

Я не нашел способ получить URL-адрес, но, возможно, localIdentifier может помочь вам выполнить ту же работу.

использование

NSString* localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier]; 

получить локальный ID и получить изображение позже.

__block NSString* localId; 
// Add it to the photo library 
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
    PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

    if (self.assetCollection) { 
     PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:self.assetCollection]; 
     [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; 
    } 
    localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier]; 
} completionHandler:^(BOOL success, NSError *error) { 
    PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil]; 
    if (!success) { 
     NSLog(@"Error creating asset: %@", error); 
    } else { 
     PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil]; 
     PHAsset *asset = [assetResult firstObject]; 
     [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
      UIImage* newImage = [UIImage imageWithData:imageData]; 
      self.imageView.image = newImage; 
     }]; 
    } 
}]; 
+0

Это работает, но чувствует себя очень страшно, я не знаю, произойдет ли это на самом деле, но такой подход может привести к состоянию гонки. –

+0

какой гонки состояние? я не был бы уверен, что localIdentifier доступен еще –

+0

привет, пожалуйста, скажите, что будет self.assetCollection здесь, какой класс, спасибо –

1

Если мы используем ALAssetsLibrary, это очень просто, чтобы сохранить изображение в фотоальбом и получить его URL:

// Get the image 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

    // Add the image in the Photo Library 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library writeImageToSavedPhotosAlbum: [image CGImage] 
           orientation: (ALAssetOrientation)[image imageOrientation] 
          completionBlock: ^(NSURL *assetURL, NSError *error) 
    { 
     if (error) 
     { 
      NSLog(@"error: %@", error); 
     } 
     else 
     { 
      NSLog(@"assetURL = %@", assetURL); 
     } 
    }]; 

Но удивительно, что невозможно сделать то же самое с новой PHPhotoLibrary!

Решение, имеющее одинаковый результат с PHPhotoLibrary, всегда приветствуется.

+0

ALAssetsLibrary Somtimes не может создать группу, – passol

+5

ALAssetsLibrary является ** ** осуждается и не должно быть используется больше. –

1

Мне не нравится это исправление, так как это может привести к состоянию гонки. До сих пор я не могу придумать лучшего решения. Если кто-то, я хотел бы услышать это :) В любом случае, здесь Swift-версия ответа РИГЕЛ Чена

import Photos 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 

     var localId:String? 
     let imageManager = PHPhotoLibrary.sharedPhotoLibrary() 

     imageManager.performChanges({() -> Void in 

      let request = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
      localId = request.placeholderForCreatedAsset?.localIdentifier 

      }, completionHandler: { (success, error) -> Void in 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 

        if let localId = localId { 

         let result = PHAsset.fetchAssetsWithLocalIdentifiers([localId], options: nil) 
         let assets = result.objectsAtIndexes(NSIndexSet(indexesInRange: NSRange(location: 0, length: result.count))) as? [PHAsset] ?? [] 

         if let asset = assets.first { 
          // Do something with result 
         } 
        } 
       }) 
     }) 
    } 
} 
+0

Это хорошо, что я проголосовал, но я заинтересован, чтобы узнать, какая польза от этой линии делает let assets = result.objectsAtIndexes (NSIndexSet (indexesInRange: NSRange (location: 0, length: result.count))) как? [PHAsset] ?? [] мы все еще можем сделать result.firsObject – SunilG

Смежные вопросы