2016-04-07 15 views
6

Mam album obrazów, które są zarządzane przez serwer zdalny. Chciałbym dać użytkownikowi opcję pobrania albumu i zapisania go w niestandardowym albumie w Zdjęciach. Ale ponieważ album jest dynamiczny (zdjęcia zostają dodane do niego), użytkownik może pobrać go wiele razy. Nie chcę wielokrotnie pobierać tych samych zdjęć, tylko te nowe.Sprawdź, czy obraz istnieje w Zdjęciach

Czy mogę powiązać niektóre metadane (unikalny identyfikator) podczas przechowywania obrazu w aplikacji Zdjęcie? A następnie sprawdź, czy ten obraz już istnieje?

Używam Photos Framework do tworzenia niestandardowego albumu i zapisywania zdjęć.

Edit: Tu jest mój kodu dla tworzenia i zapisywania niestandardowego album zdjęć

/** Returns the first album from the photos app with the specified name. */ 
static func getAlbumWithName(name: String, completion: (album: PHAssetCollection?) -> Void) { 

    let fetchOptions = PHFetchOptions() 
    fetchOptions.predicate = NSPredicate(format: "localizedTitle = %@", name) 
    let fetchResult = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options: fetchOptions) 

    if fetchResult.count > 0 { 

     guard let album = fetchResult.firstObject as? PHAssetCollection else {return} 
     completion(album: album) 

    } else { 

     PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 

      PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(name) 

      }, completionHandler: { (result, error) in 

       if result { 

        FileUtils.getAlbumWithName(name, completion: completion) 

       } else { 

        completion(album: nil) 

       } 


     }) 

    } 

} 

/** Adds an image to the specified photos app album */ 
private static func addImage(image: UIImage, toAlbum album: PHAssetCollection, completion: ((status: Bool) -> Void)?) { 

    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 

     let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
     let assetPlaceholder = assetRequest.placeholderForCreatedAsset 
     let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: album) 
     albumChangeRequest?.addAssets([assetPlaceholder!]) 


    }) { (status, error) in 

     completion?(status: status) 

    } 

} 
+0

przydatne może być edytowanie pytania w celu wyświetlenia kodu pobierania i zapisywania zdjęć w tym niestandardowym albumie –

Odpowiedz

1

Wszystko, co musisz zrobić, to czytać „localIdentifier” z zastępczy aktywów. Rozszerzyłem twój kod, aby zwrócić identyfikator w module obsługi zakończenia. Możesz lubisz sobie radzić z tymi opcjami.

private static func addImage(image: UIImage, toAlbum album: PHAssetCollection, completion: ((status: Bool, identifier: String?) -> Void)?) { 

    var localIdentifier: String? 
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 

     let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
     let assetPlaceholder = assetRequest.placeholderForCreatedAsset 
     let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: album) 
     albumChangeRequest?.addAssets([assetPlaceholder!]) 
     localIdentifier = assetPlaceholder?.localIdentifier 

    }) { (status, error) in 

     completion?(status: status, identifier: localIdentifier) 

    } 
} 

Jeśli chcesz ponownie odczytać ten zasób, twoja metoda obrazu obciążenia może wyglądać mniej więcej tak (nie używałem twoich konwencji lub nazw zmiennych). Spowoduje to synchroniczne odczytanie zasobu, ale jestem pewien, że możesz znaleźć opcję asynchroniczną.

internal func loadPhoto(identifier: String) -> UIImage? { 
    if assetCollection == nil { 
     return nil 
    } 

    let fetchOptions = PHFetchOptions() 
    fetchOptions.predicate = NSPredicate(format: "localIdentifier = %@", identifier) 
    let fetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: fetchOptions) 
    if fetchResult.count > 0 { 
     if let asset = fetchResult.firstObject as? PHAsset { 
      let options = PHImageRequestOptions() 
      options.deliveryMode = .HighQualityFormat 
      options.synchronous = true 
      var result: UIImage? 
      PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight), contentMode: .AspectFit, options: options, resultHandler: {(image: UIImage?, _: [NSObject: AnyObject]?) -> Void in 
       result = image 
      }) 
      return result 
     } 
    } 
    return nil 
}