- This topic has 11개 답변, 2명 참여, and was last updated 4 years, 3 months 전에 by 야곰.
-
글쓴이글
-
-
okwkdalsgur참가자
- 글작성 : 3
- 답글작성 : 7
현재 PHAsset의 fetchAssets 메소드를 통해 비디오 썸네일을 collectionView를 통해 보여주고
썸네일 중 하나를 선택하면 선택 썸네일에 해당하는 비디오를 다음 뷰로 넘겨주는 로직 입니다.
문제는 선택한 썸네일에 해당하는 asset통해 동영상의 url을 가져오는데 발생합니다.
이 saveImage 함수는 prepare에서 실행되는데
PHImageManager.default().requestAVAsset이 비동기로 실행되며 이 saveImage함수 이후
core data를 가져와 다음 뷰에 넘겨줘야 하는데 saveImage안 requestAVAsset 함수가 비동기로
돌아가서 그런지 바로 index out of range 오류가 발생합니다.
혹시 requestAVAsset을 무조건 실행하고 다음 코드로 넘어갈수 있는 방법이 있을까요?
아니면 다른 방식으로 접근해야 할까요?
감사합니다!
2020-09-07 오후 9:29 #29317 -
-
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 클로저에 문법적인 오류가 있는 건지 궁금합니다!
감사합니다.
2020-09-08 오후 9:48 #29432-
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
completion handler의 용법을 아직 잘 이해하지 못한것 같아요.
맨 아래 있는 let beforeSelected… 부터 아래의 코드들을saveImage
의 completion handler 클로저 안으로 옮겨야하지 않을까합니다.
그런데 이 방법 보다는,saveImage
메서드를 사용해서 데이터를 모두 가져온 다음에 completion handler에서 swgue를 실행해주는게 낫지 않을까합니다. segue를 특정 컨트롤(버튼 등)의 이벤트에 곧바로 연결하지 말고 identifier로 실행하도록 하면 됩니다.2020-09-08 오후 10:38 #29434-
okwkdalsgur참가자
- 글작성 : 3
- 답글작성 : 7
escaping closure에 대해 계속 공부하고 적용하는데 계속 똑같은 오류가 발생합니다..
escaping closure를 매개변수로 받는 함수의 동작이 완료 된후에 closure가
실행된다고 공부 하였고 saveImage가 끝나는 부분에 completion을 실행하였습니다.
그런데 completion에 들어가는 videoURL 변수가 nil값으로 오류가 발생합니다.
requestAVAseet 함수의 클로저 부분안에서 모든 활동이 완료 되지 않은채 끝나는것 같습니다.
혹시 escaping에 대해 제가 아직도 이해하지 못하고 있거나 다른 부분에서 문제가 있을 수 있나요?
(번거롭게 질문드려서 죄송합니다.. ㅜ)
2020-09-09 오후 10:15 #29515-
-
okwkdalsgur참가자
- 글작성 : 3
- 답글작성 : 7
늦은 시간에 질문 드려 죄송합니다!
일단 말씀해 주신대로 resultHandler안에 complition closure를 넣고 테스트를 해보았는데 (2군데)
모두 똑같은 오류가 발생합니다. 이 함수에 대한 버그나 이 함수를 대체할 다른 메소드 또는 아예 다른 방법을 찾아 봐야 할까요?
2020-09-09 오후 11:24 #29521 -
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
오류가 무엇인지 알려주면 훨씬 유추가 쉬울텐데요^^;
제가 추측하기로는
videoURL
이nil
일 수도 있지 않을까합니다.
디버깅에 대해서는 LLDB 정복하기 코스를 한 번 훑어보는걸 추천합니다.
실력이 비약적으로 향상될거예요.2020-09-10 오전 12:45 #29525 -
okwkdalsgur참가자
- 글작성 : 3
- 답글작성 : 7
아 오류가 어딘지 안알려드렸네요!
requestAVAsset이 돌기도 전에 다음 코드로 넘어가 videoURL이 nil로 남아있어
오류가 나고 있습니다. escaping closure를 적절한 위치에 적었는데도 함수가 다 돌기 전에
다음 코드로 넘어가는 경우가 더러 있나요?
강좌 추천 감사합니다!! 꼭 다 시청하고 실력을 늘려보겠습니다
2020-09-10 오전 9:12 #29528 -
okwkdalsgur참가자
- 글작성 : 3
- 답글작성 : 7
계속 requestAVAsset 함수를 건너 뛰는 오류가 발생하고 있습니다… ㅠㅠㅠ 오늘도 몇시간동안 구글링하고 lldb도 적용해 봤는데
답이 나오질 않네요. 분명히 requestAVAsset의 resultHandler escaping 클로저가 실행되지 않아서 생겨난 오류인것 같습니다.
requestAVAsset 함수가 끝난후 escaping closure인 resultHandler가 실행되고 그 후에
resultHandler안의 completion escaping 클로저가 실행될텐데 여기서는 왜 escaping 클로저를 모두 무시하고
실행 되는지 정말 궁금합니다!
2020-09-10 오후 8:33 #29543
-
-
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.