2017-02-18 9 views
3

안녕하세요. 학습 프로젝트로 사진 앨범 앱을 만들고 있는데 PHPhotoLibrary.shared().performChangesAndWait과 관련된 문제가 있습니다. 주요 문제는 그 코드가 PHPhotoLibrary.shared().performChangesAndWait 인 saveImage 메소드를 사용할 때입니다. 이미지를 저장하기 전에 PHPhotoLibrary.shared().performChangesAndWait이 종료되기 전에이 메서드가 종료됩니다. 문서가 완료 될 때까지 기다려야한다고 말하는 performChangesAndWait 메서드를 사용하는 경우에도 코드가 비동기 적으로 실행되는 것 같습니다. 앱이 처음으로 실행처음 앨범을 실행할 때 맞춤 앨범에 사진을 저장하지 못합니다.

func saveImage(_ image: UIImage) ->Bool { 
    print("Executing saveImage") 
    var result:Bool = false 
    if assetCollection == nil { 
     print("the album is nil") 
     return result 
    } 
    print("saveImage: we will start saving the image") 
    //TODO: the return false is happening before the photo is save. 
    do 
    { 
     try PHPhotoLibrary.shared().performChangesAndWait({ 
      let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image) 
      let assetPlaceHolder = assetChangeRequest.placeholderForCreatedAsset 
      let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection) 
      let enumeration: NSArray = [assetPlaceHolder!] 
      albumChangeRequest!.addAssets(enumeration) 
      print("saveImage: image was save without issues") 
      result = true 
      print("saveImage: result value after saving the image: \(result)") 
     }) 
    } 
    catch let error 
    { 
     result = false 
     print("saveImage: there was a problem: \(error.localizedDescription)") 
    } 


    print("saveImage: result value before exiting the method: \(result)") 
    return result 

} 

기본적 때 다시 반환 결과는 이미지 블록 완료를 저장하기 전에 실행 가져옵니다 여기

내 클래스에서 saveImage 방법의 코드입니다.

실제로 performChangesAndWait 메서드가 실제로 완료 될 때까지 saveImage 메서드가 실제로 기다릴 수있는 방법이 있습니까?

미리 도움을 주셔서 감사합니다.

답변

3

performChangesAndWait은 비동기 콜백 메소드입니다. result의 변경 내용이 performChangesAndWait 안에 있으면 해당 스레드가 다른 스레드에 있기 때문에 결과에 반영되지 않습니다.

saveImage 메서드가 완료 될 때까지 기다리는 한 가지 방법은 콜백을 구현하는 것입니다. 다음과 같이 입력하십시오 :

func saveImage(_ image: UIImage, callback: @escaping(_ result: Bool)->Void) { 
    print("Executing saveImage") 

    if assetCollection == nil { 
     print("the album is nil") 
     callback(false) 
    } 
    print("saveImage: we will start saving the image") 
    //TODO: the return false is happening before the photo is save. 
    do { 
     try PHPhotoLibrary.shared().performChangesAndWait({ 
      let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image) 
      let assetPlaceHolder = assetChangeRequest.placeholderForCreatedAsset 
      let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection) 
      let enumeration: NSArray = [assetPlaceHolder!] 
      albumChangeRequest!.addAssets(enumeration) 
      print("saveImage: image was save without issues") 

      callback(true) 
     }) 
    } 
    catch let error { 
     print("saveImage: there was a problem: \(error.localizedDescription)") 
     callback(false) 
    } 
} 

알려 주신 내용을 알려주십시오.

+0

트릭을 많이 주셔서 감사합니다. – JuValencia