私は同様の質問投稿: Swift 3 or 4 Saving to custom album creates duplicate images
をしかし、私は同様にコオロギが、何も得ませんでした。幸いにも、私は答えを見つけたと思う。私は自分の質問にも答えます。
あなたが持っているコード(私が持っていたのと同じコードでした)は、新しいアセットを作成することです。これは、ユーザーがカメラで写真を撮った後にカスタムアルバムに画像を保存する場合にのみ便利です。これは新しい資産のためのものです。
ただし、既存のアセットの場合、新しいアセットを作成する必要はありません。代わりに、既存のアセットをカスタムアルバムに追加する必要があります。これを行うには、別の方法が必要です。ここに私が作成したコードがあり、それは動作しているようです。自分のメソッドに送信して既存のアセットにアクセスできるように、アセットIDを最初に取得する必要があることに注意してください。
したがって、imagePickerControllerでは、ユーザーが既存のイメージを選択したかどうか、またはメソッドが新しいカメラアクションから呼び出されているかどうかを判断する必要があります。
let pickerSource = picker.sourceType;
switch(pickerSource){
case .savedPhotosAlbum, .photoLibrary:
if(let url = info[UIIMagePickerControllerReferenceURL] as? NSURL{
let refURLString = refURL?.absoluteString;
/* value for refURLString looks something like assets-library://asset/asset.JPG?id=82A6E75C-EA55-4C3A-A988-4BF8C7F3F8F5&ext=JPG */
let refID = {function here to extract the id query param from the url string}
/*above gets you the asset ID, you can get the asset directly, but it is only
available in ios 11+.
*/
MYPHOTOHELPERCLASS.transferImage(toAlbum: "myalbumname", withID: refID!, ...)
}
break;
case .camera:
...
break;
}
今、あなたのphotohelperクラスに(または任意のどこでも任意の関数、中)、資産をEDITはなく、新しいものを作成するには、これは私が持っているものです。私はchangeRequest変数を省略することができると仮定しています。この権利を得るまで、私は周りを遊んでいました。完全にばかげたリンゴのドキュメントを見て、少なくとも私は遊ぶべき他の方法があることに気づくことができました。 NSFastEnumerationパラメータは、プレースホルダPHObjectPlaceholderオブジェクトだけでなく、PHAssetsのNSArrayでもかまいません。
public static func transferImage(toAlbum albumName:String, withID imageID:String, onSuccess success:@escaping(String)->Void, onFailure failure:@escaping(Error?)->Void){
guard let album = self.getAlbum(withName: albumName) else{
... failure here, albumNotFoundError
return;
}
if(self.hasImageInAlbum(withIdentifier: imageID, fromAlbum: albunName)){
... failure here, image already exists in the album, do not make another
return;
}
let theAsset = self.getExistingAsset(withLocalIdentifier: imageID);
if(theAsset == nil){
... failure, no asset for asset id
return;
}
PHPhotoLibrary.shared().performChanges({
let albumChangeRequest = PHAssetCollectionChangeRequest(for: album);
let changeRequest = PHAssetChangeRequest.init(for: theAsset!);
let enumeration:NSArray = [theAsset!];
let cnt = album.estimatedAssetCount;
if(cnt == 0){
albumChangeRequest?.addAssets(enumeration);
}else{
albumChangeRequest?.inserAssets(enumeration, at: [0]);
}
}){didSucceed, error) in
OperationQueue.main.addOperation({
didSucceed ? success(imageID) : failure(error);
})
}
}
だから、それは代わりに資産作成要求を作成し、作成した資産のためのプレースホルダを生成する以外、ほとんど同じである、あなたはだけでなく、既存の資産を取得するために、既存のアセットIDを使用して、既存の追加します新たに作成されたアセットプレースホルダではなく、addasset/insertasset NSArrayパラメータにアセットを追加します。