首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PHAsset从一个相册移动/复制到另一个相册

问将PHAsset从一个相册移动/复制到另一个相册
EN

Stack Overflow用户
提问于 2016-02-06 21:11:19
回答 1查看 1.4K关注 0票数 0

我想将资产从一个相册移动到另一个相册。但我只能找到有关创建和删除资产的信息。我想要移动而不是创建新的和删除旧拷贝的原因是,我想保留像资产的localIdentifier这样的数据位。如果我在另一个相册中重新创建一个资源,它将被分配一个新的localIdentifier,对吗?

但这似乎是不可能的。因此,我至少采取了复制资产的方式。但它也给我带来了麻烦。

这是我的代码。

代码语言:javascript
复制
func copyAsset() {
    if let assets = getAssetsFromCollection(collectionTitle: "Old") {
        if getAssetColection("New") == nil {
            createCollection("New") { collection in
                if let collection = collection {
                    print("Collection created")
                    self.copyAssetsToCollection(assets, toCollection: collection)
                }
            }
        }
    }
}

/**
 Copy assets to album.

 - parameter assets:     Array of assets to copy.
 - parameter collection: The collection where the assets need to be copied.
 */
func copyAssetsToCollection(assets: [PHAsset], toCollection collection: PHAssetCollection) {
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({
        let asset = assets.first!
        print(asset.localIdentifier)
        let assetChangeRequest = PHAssetChangeRequest(forAsset: asset)
        let assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset!

        let collectionChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: collection)!
        collectionChangeRequest.addAssets([assetPlaceholder])
    }, completionHandler: { success, error in
        if success {
            print("Photo copied to collection")
        } else {
            if let error = error {
                print("Error adding photos to collection: \(error.code) - \(error.localizedDescription)")
            }
        }
    })
}

/**
 Retrieve the album for the given title.

 - parameter title: Album title.

 - returns: Album if it exists. nil if it doesn't.
 */
func getAssetColection(title: String) -> PHAssetCollection? {
    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title ==[cd] %@", title)
    if let collection = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .AlbumRegular, options: fetchOptions).firstObject {
        return collection as? PHAssetCollection
    }
    return nil
}

/**
 Get assets from a given album.

 - parameter title: Album title.

 - returns: An array of assets if they exist. nil if they don't.
 */
func getAssetsFromCollection(collectionTitle title: String) -> [PHAsset]? {
    var assets = [PHAsset]()
    if let collection = getAssetColection(title) {
        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.Image.rawValue)
        let fetchResult = PHAsset.fetchAssetsInAssetCollection(collection, options: fetchOptions)
        fetchResult.enumerateObjectsUsingBlock { object, index, stop in
            if let asset = object as? PHAsset {
                assets.append(asset)
            }
        }
        return assets
    }
    return nil
}

/**
 Create an album in Photos app.

 - parameter title:      Album title.
 - parameter completion: Album if successfully created. nil if it fails.
 */
func createCollection(title: String, completion: (collection: PHAssetCollection?) -> ()) {
    var albumPlaceholder: PHObjectPlaceholder!
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({
        let request = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(title)
        albumPlaceholder = request.placeholderForCreatedAssetCollection
    }, completionHandler: { success, error in
        if success {
            let fetchResult = PHAssetCollection.fetchAssetCollectionsWithLocalIdentifiers([albumPlaceholder.localIdentifier], options: nil)
            completion(collection: fetchResult.firstObject as? PHAssetCollection)
        } else {
            if let error = error {
                print("Failed to create album: \(title) in Photos app: \(error.code) - \(error.localizedDescription)")
                completion(collection: nil)
            }
        }
    })
}

应用程序在查找placeholderForCreatedAsset的nil值的let assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset!行崩溃。这意味着PHAssetChangeRequest(forAsset: asset)只能用于更改资产的元数据,而不能复制它。

有没有其他方法可以做到这一点?有什么变通或破解方法吗?我真的很感谢任何人的帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-02-09 08:12:16

没有什么比将资源从一个相册复制到另一个相册更好的了:在iOS照片库中,所有原始照片/视频都位于“所有照片”/“相机卷轴”中。相册只包含位于“所有照片/相机胶卷”中的原始照片/视频的引用。这意味着您可以将一张照片分配给n个相册。要管理这些作业,请查看PHAssetCollectionChangeRequest类。要在相册中添加一个或多个照片/视频,请使用addAssets:;要从相册中删除资产,请使用removeAssets:方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35241409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档