Ios 选择图片会导致“重新保存到摄影机滚动”

Ios 选择图片会导致“重新保存到摄影机滚动”,ios,swift,save,uiimagepickercontroller,camera-roll,Ios,Swift,Save,Uiimagepickercontroller,Camera Roll,我有一个程序,用户在其中选择一张照片放在屏幕上,代码会自动将其放入自定义相册中。但是,每当他们选择一张图片时,它就会将其重新保存到相机胶卷上,从而创建副本。我如何让它停止这样做 func fetchAssetCollectionForAlbum() -> PHAssetCollection? { let fetchOptions = PHFetchOptions() fetchOptions.predicate = NSPredicate(format: "title =

我有一个程序,用户在其中选择一张照片放在屏幕上,代码会自动将其放入自定义相册中。但是,每当他们选择一张图片时,它就会将其重新保存到相机胶卷上,从而创建副本。我如何让它停止这样做

func fetchAssetCollectionForAlbum() -> PHAssetCollection? {
    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
    // fetch the asset for the album
    let collection = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

    var picturePlaceHolder: PHObjectPlaceholder? = nil

    if let _: AnyObject = collection.firstObject {
        return collection.firstObject
    }
    return nil
}

func save(image: UIImage) {
    if assetCollection == nil {
        return
    }

    PHPhotoLibrary.shared().performChanges({
        let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
        let assetPlaceHolder = assetChangeRequest.placeholderForCreatedAsset
        let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection)
        let enumeration: NSArray = [assetPlaceHolder!]
        albumChangeRequest!.addAssets(enumeration)

    }, completionHandler: nil)
}

我发布了一个类似的问题:

但我除了蟋蟀什么也没有。幸运的是,我想我找到了答案。我也会回答我自己的问题

您拥有的代码(与我拥有的代码相同)是创建新资产。它仅在用户使用相机拍照后将图像保存到自定义相册中时有用。这是为了全新的资产

但是,对于现有资源,您不希望创建新资源。相反,您希望将现有资源添加到自定义相册中。要做到这一点,您需要一种不同的方法。这是我创建的代码,它似乎正在工作。请记住,您必须首先获取资产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类中(或在任何地方的任何函数中),编辑资源而不是创建新资源,这就是我所拥有的。我假设可以使用changeRequest变量。我只是随便玩玩,直到弄好为止。翻阅这些完全荒谬的苹果文档,我至少注意到还有其他的方法可以使用。我发现NSFastEnumeration参数可以是相集的NSArray,而不仅仅是占位符PHObjectPlaceholder对象

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参数,而不是新创建的资产占位符