微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 PHAsset 的参考从“所有照片”/“相机胶卷”移动到特定的 PHAssetCollection?

如何解决如何将 PHAsset 的参考从“所有照片”/“相机胶卷”移动到特定的 PHAssetCollection?

我正在使用 OpalImagePickerController 从“所有照片”/“相机胶卷”中选择图像/视频,它给了我 [PHAsset],这很好,但我想将它们添加到照片应用中的特定相册我为此使用了以下代码

@objc func btnAddTapped() {
    
    guard UIImagePickerController.isSourceTypeAvailable(.photoLibrary) else {
        //Show error to user?
        return
    }

    //Example Instantiating OpalImagePickerController with Closures
    let imagePicker = OpalImagePickerController()

    //Present Image Picker
    presentOpalImagePickerController(imagePicker,animated: true,select: { (selectedAssets) in
        
        imagePicker.dismiss(animated: true,completion: nil)
        
        let sdLoader = SDLoader()
        sdLoader.startAnimating(atView: self.view)
        
        let options = PHImageRequestOptions()
        options.deliveryMode = .highQualityFormat
        options.isNetworkAccessAllowed = true
        
        let videoOptions = PHVideoRequestOptions()
        videoOptions.deliveryMode = .highQualityFormat
        videoOptions.isNetworkAccessAllowed = true
        
        let myGroup = dispatchGroup()
        
        for item in selectedAssets {
            
            myGroup.enter()
            
            let asset = item
            if asset.mediaType == PHAssetMediaType.video {
                //Fetch URL if its a video
                PHCachingImageManager().requestAVAsset(forVideo: asset,options: videoOptions) { (playerItem,audioMix,args) in
                    
                    if let videoAVAsset = playerItem as? AVURLAsset {
                        let url = videoAVAsset.url
                        PhotoManager.instance.storeVideoToSpecificAlbum(videoURL: url,to: self.asset,completion: {_ in
                            print("video stored")
                            myGroup.leave()
                        })
                    }
                }
                
            } else {
                //Image
                PHImageManager.default().requestimageDataAndOrientation(for: asset,options: options,resultHandler: {(data,string,orientation,any) in
                    if let data = data {
                        dispatchQueue.main.async {
                            if let img = UIImage(data: data) {
                                PhotoManager.instance.storeImagetoSpecificAlbum(image: img,completion: {_ in
                                    print("Image stored")
                                    myGroup.leave()
                                })
                            }
                        }
                    }
                })
            }
        }
        
        myGroup.notify(queue: .main) {
            sdLoader.stopAnimation()
            self.fetchImagesFromAlbum()
        }
        
    },cancel: {
        print("cancel tapped")
    })
}

这是我使用的辅助方法

//Store Video
func storeVideoToSpecificAlbum(videoURL: URL,to album: PHAssetCollection,completion: @escaping (PHAssetCollection?) -> Void) {
    
    PHPhotoLibrary.shared().performChanges({
        let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL)
        let placeholder = assetRequest?.placeholderForCreatedAsset
        guard let _placeholder = placeholder else { completion(nil); return }
        
        let albumChangeRequest = PHAssetCollectionChangeRequest(for: album)
        albumChangeRequest?.addAssets([_placeholder] as NSFastEnumeration)
    }) { success,error in
        completion(album)
    }
}

//Store Image
func storeImagetoSpecificAlbum(image: UIImage,completion: @escaping (PHAssetCollection?) -> Void) {
    
    PHPhotoLibrary.shared().performChanges({
        let assetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
        let placeholder = assetRequest.placeholderForCreatedAsset
        guard let _placeholder = placeholder else { completion(nil); return }
        
        let albumChangeRequest = PHAssetCollectionChangeRequest(for: album)
        albumChangeRequest?.addAssets([_placeholder] as NSFastEnumeration)
    }) { success,error in
        completion(nil)
    }
}

我的问题是它在“所有照片”/“相机胶卷”中复制了图像/视频。

我还发现了一些关于它的帖子:

Move/copy PHAsset from one album to another

但这对我没有帮助。

解决方法

您在此处请求原始文件 -

// Video
PHCachingImageManager().requestAVAsset(forVideo: asset,options: videoOptions) { (playerItem,audioMix,args) in

// Image
PHImageManager.default().requestImageDataAndOrientation(for: asset,options: options,resultHandler: { (data,string,orientation,any) in

然后在这里创建一个新的/重复的资产 -

let assetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
let placeholder = assetRequest.placeholderForCreatedAsset

我们对创建新的 PHAsset 不感兴趣 - 我们将现有的 PHAsset 链接到相册。你需要做的很简单 -

PHPhotoLibrary.shared().performChanges({
    let albumUpdateRequest = PHAssetCollectionChangeRequest(for: album) // album you plan to update
    albumUpdateRequest?.addAssets(NSArray(array: [asset])) // asset you plan to add
},completionHandler: { (completed,error) in
    print("completed: \(completed),error: \(String(describing: error))")
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。