2016-04-07 10 views
6

リモートサーバーで管理されている画像のアルバムがあります。私はアルバムをダウンロードして写真のカスタムアルバムに保存するオプションをユーザーに与えたいと思います。しかし、アルバムは動的なので(写真が追加されると)、ユーザーは複数回ダウンロードできます。私は同じ写真を複数回、新しいものだけをダウンロードしたくない。写真に画像があるか確認してください

写真アプリに画像を保存するときにメタデータ(一意のID)を関連付けることはできますか?その画像が既に存在するかどうかを確認します。

写真フレームワークを使用してカスタムアルバムを作成し、写真を保存しています。

編集:ここでは、カスタムアルバムの作成や写真

/** 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

このカスタムアルバムに写真をダウンロードして保存する方法のコードを表示するために質問を編集すると役立つ場合があります –

答えて

1

を保存するための私のコードは、あなたがする必要があるのは、資産のプレースホルダから「localIdentifier」をお読みれます。補完ハンドラで識別子を返すようにコードを補強しました。あなたはそれらの選択肢に対処したいかもしれません。

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) 

    } 
} 

このアセットをもう一度読みたい場合、読み込みイメージの方法は次のようになります(私はあなたの規約や変数名を使用していません)。これは資産を同期して読み込みますが、非同期オプションを見つけることができると確信しています。

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 
} 
関連する問題