비동기적으로 비디오 파일을 가져오는데 있어 질문이 있습니다.

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • okwkdalsgur
      참가자
      • 글작성 : 3
      • 답글작성 : 7

       현재 PHAsset의 fetchAssets 메소드를 통해 비디오 썸네일을 collectionView를 통해 보여주고

      썸네일 중 하나를 선택하면 선택 썸네일에 해당하는 비디오를 다음 뷰로 넘겨주는 로직 입니다.

      문제는 선택한 썸네일에 해당하는 asset통해 동영상의 url을 가져오는데 발생합니다.

      이 saveImage 함수는 prepare에서 실행되는데

      PHImageManager.default().requestAVAsset이 비동기로 실행되며 이 saveImage함수 이후 

      core data를 가져와 다음 뷰에 넘겨줘야 하는데 saveImage안 requestAVAsset 함수가 비동기로 

      돌아가서 그런지 바로 index out of range 오류가 발생합니다.

      혹시 requestAVAsset을 무조건 실행하고 다음 코드로 넘어갈수 있는 방법이 있을까요?

      아니면 다른 방식으로 접근해야 할까요?

      감사합니다!

       

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      escaping closure를 활용해서 saveImage 메서드에 completion handler 등을 구현해보세요 🙂

      • okwkdalsgur
        참가자
        • 글작성 : 3
        • 답글작성 : 7

        답변 정말 감사드립니다!

        일단 saveImage메소드에 escaping 클로저를 만들었는데 똑같은 오류가 발생하고 있습니다.

        requestAVAsset메소드 안 print(“wow”)가 실행되지 않는것으로 봐서 여전히 비동기적으로 실행되고 있는것 같습니다.

        requestAVAsset에 대한 애플 도큐먼트는 “Requests AVFoundation objects representing the video asset’s content and state, to be loaded asynchronously.”

        라고 써있는데 이런식으로 서술되어 있다면 이 함수를 무조건 실행 후 다른 함수를 실행 하는 방식으로할 수 없는지, 아니면 제가 만든 completion 클로저에 문법적인 오류가 있는 건지 궁금합니다!

        감사합니다.

         

        • 야곰
          키 마스터
          • 글작성 : 37
          • 답글작성 : 579

          completion handler의 용법을 아직 잘 이해하지 못한것 같아요.
          맨 아래 있는 let beforeSelected… 부터 아래의 코드들을 saveImage의 completion handler 클로저 안으로 옮겨야하지 않을까합니다.
          그런데 이 방법 보다는, saveImage 메서드를 사용해서 데이터를 모두 가져온 다음에 completion handler에서 swgue를 실행해주는게 낫지 않을까합니다. segue를 특정 컨트롤(버튼 등)의 이벤트에 곧바로 연결하지 말고 identifier로 실행하도록 하면 됩니다.

          • okwkdalsgur
            참가자
            • 글작성 : 3
            • 답글작성 : 7

            escaping closure에 대해 계속 공부하고 적용하는데 계속 똑같은 오류가 발생합니다..

            escaping closure를 매개변수로 받는 함수의 동작이 완료 된후에 closure가 

            실행된다고 공부 하였고 saveImage가 끝나는 부분에 completion을 실행하였습니다.

            그런데 completion에 들어가는 videoURL 변수가 nil값으로 오류가 발생합니다.

            requestAVAseet 함수의 클로저 부분안에서 모든 활동이 완료 되지 않은채 끝나는것 같습니다.

            혹시 escaping에 대해 제가 아직도 이해하지 못하고 있거나 다른 부분에서 문제가 있을 수 있나요?

            (번거롭게 질문드려서 죄송합니다.. ㅜ)

            • 야곰
              키 마스터
              • 글작성 : 37
              • 답글작성 : 579

              saveImage의 핸들러는 잘 구현하셨습니다 🙂
              거의 다 왔네요!
              requestAVAsset 메서드 자체도 비동기적으로 동작하기 때문에 resultHandler 매개변수가 있네요.
              saveImagecompletion 핸들러는 requestAVAsset 메서드의 resultHandler 내부에서 실행해야 하지 않을까요?
              비동기 동작에 대해 조금 더 면밀히 이해해볼 필요가 있습니다.

              • okwkdalsgur
                참가자
                • 글작성 : 3
                • 답글작성 : 7

                늦은 시간에 질문 드려 죄송합니다!

                일단 말씀해 주신대로 resultHandler안에 complition closure를 넣고 테스트를 해보았는데 (2군데)

                모두 똑같은 오류가 발생합니다. 이 함수에 대한 버그나 이 함수를 대체할 다른 메소드 또는 아예 다른 방법을 찾아 봐야 할까요?

              • 야곰
                키 마스터
                • 글작성 : 37
                • 답글작성 : 579

                오류가 무엇인지 알려주면 훨씬 유추가 쉬울텐데요^^;

                제가 추측하기로는 videoURLnil 일 수도 있지 않을까합니다.
                디버깅에 대해서는 LLDB 정복하기 코스를 한 번 훑어보는걸 추천합니다.
                실력이 비약적으로 향상될거예요.

              • okwkdalsgur
                참가자
                • 글작성 : 3
                • 답글작성 : 7

                아 오류가 어딘지 안알려드렸네요!

                requestAVAsset이 돌기도 전에 다음 코드로 넘어가 videoURL이 nil로 남아있어

                오류가 나고 있습니다. escaping closure를 적절한 위치에 적었는데도 함수가 다 돌기 전에 

                다음 코드로 넘어가는 경우가 더러 있나요?

                강좌 추천 감사합니다!! 꼭 다 시청하고 실력을 늘려보겠습니다

              • 야곰
                키 마스터
                • 글작성 : 37
                • 답글작성 : 579

                그렇진 않습니다.
                completion 핸들러가 위에 주석친 한 곳에서만 실행하도록 해야하는데, 아래에도 실행하도록 했네요.
                주석으로 처리한 핸들러만 실행하도록 해보세요.

              • okwkdalsgur
                참가자
                • 글작성 : 3
                • 답글작성 : 7

                계속 requestAVAsset 함수를 건너 뛰는 오류가 발생하고 있습니다… ㅠㅠㅠ 오늘도 몇시간동안 구글링하고 lldb도 적용해 봤는데

                답이 나오질 않네요. 분명히 requestAVAsset의 resultHandler escaping 클로저가 실행되지 않아서 생겨난 오류인것 같습니다.

                requestAVAsset 함수가 끝난후 escaping closure인 resultHandler가 실행되고 그 후에 

                resultHandler안의 completion escaping 클로저가 실행될텐데  여기서는 왜 escaping 클로저를 모두 무시하고

                실행 되는지 정말 궁금합니다!

              • 야곰
                키 마스터
                • 글작성 : 37
                • 답글작성 : 579

                지금 굉장히 답답한 심정에 대해 잘 이해합니다.
                마음이 급하니 근본적인 문제에 접근하지 못하고 있어요.
                비동기 코드와 비동기 프로그래밍에 대해서 별도로 공부를 하고 이해를 해야 풀릴 문제입니다.
                print를 저 위치에 출력하고 있는 것을 보면 아직 그 이해가 없는것 같아요.
                지금 제 말이 야속하게 들리겠지만, 비동기 프로그래밍에 대한 이해를 다시 하고 코드에 접근하는게 좋겠습니다. ^^;

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom