ios - 检查照片中是否存在图像

标签 ios swift

我有一个由远程服务器管理的图像相册。我想为用户提供下载相册并将其存储到照片中的自定义相册的选项。但由于相册是动态的(照片被添加到其中),用户可以多次下载它。我不想多次下载相同的图片,只想下载新的。

当我将图像存储在照片应用程序中时,是否可以关联一些元数据(唯一 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)

    }

}

最佳答案

您需要做的就是从 Assets 占位符中读取“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)

    }
}

当您想再次读取该 Assets 时,您的加载图像方法可能看起来像这样(我没有使用您的约定或变量名称)。这将同步读取 Assets ,但我相信您可以发现异步选项。

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
}

关于ios - 检查照片中是否存在图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36469279/

相关文章:

ios - 无法将类型 '([AnyObject]!, NSError!) -> Void' 的值转换为预期参数类型 'CLGeocodeCompletionHandler'

ios - 从图像选择器中将图像保存在 nsuserdefault 中并获取其他 View Controller

ios - 延迟 RACSignal 直到 UIScrollView 不拖动、跟踪或减速

ios - 如何使用 PKAddPassButton 为具有本地化的通行证创建 "Add to apple wallet"按钮

ios - 在 Swift 中找不到源文件

ios - 从 AppDelegate Swift 4 更新 tableView 行

ios - Swift:在带有完成按钮的文本框上弹出 DatePicker

ios - 缺少必需的图标文件。 bundle 不包含

ios - 如何在 NativeScript 中使用 swift 库?

ios - 如何管理 2G 网络上的 openfire 连接?