url 통신 관련해서 질문 있습니다.

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 광현
      참가자
      • 글작성 : 15
      • 답글작성 : 26

      부스트 코스 5강의 영화 어플을 만드는 중인데, url 통신하는 부분을 별도의 싱글톤 클래스로 분리하여 만들었습니다.

       

      tableview나 collectionview가 존재하는 viewcontroller의 viewDidLoad에서 url 통신을 담당하는 NetworkHandler의 싱글톤 인스턴스의 데이터를 받아올 것이라고 예상했는데 받기 전 상태가 먼저 실행되서 moives nil 이라고 출력되며 종료됩니다.

      이 문제점을 해결할 수 있는 방법이 있을 까요? 별도의 클래스로 만들지 않고 viewcontroller 내의 메쏘드로 만들어 url 통신을 한뒤 데이터를 받아 table이나 collectionview를 reload하는  것은 프로퍼티 감시자 didSet을 이용해서 성공했습니다.

      • 이 게시글은 광현에 의해 4 years, 6 months 전에 수정됐습니다.
      • 이 게시글은 광현에 의해 4 years, 6 months 전에 수정됐습니다.
    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      가장 간단한 답변을 먼저 달자면, getData의 메소드에 completionHandler를 전달하여 dataTask가 완료되면 해달 completionHandler를 실행하는 방법이 있겠습니다.
      getData는 메서드 내부의 dataTask의 dataTask 메서드가 비동기로 실행되므로, print 함수는 대체적으로 dataTask보다 먼저 실행될 수 밖에 없습니다.
      print 함수를 dataTask 메서드 안에서 실행하는 것과 지금의 위치에서 실행하는 것과 어떤 차이가 있을지 다시 한 번 깊이 생각해보세요.
      생각해 보아도 결론이 나지 않으면 break point를 잡아서 디버깅 해보면 좀 더 도움이 되지 않을까합니다.

    • 광현
      참가자
      • 글작성 : 15
      • 답글작성 : 26

      야곰님 리플과 스터디원 중 쥬니어 개발자 분의 조언을 듣고 @escaping Closure를 공부하느라 조금 시간이 오래 걸렸습니다.

      @escaping Closure 개념 요약

      • 클로져가 함수로부터 Escape 한다는 것은 해당 함수의 인자로 Closure가 전달되지만, 함수가 반환된 후 실행 되는 것을 의미
      • 클로져의 Escaping은 A 함수가 마무리 된 상태에서만 B 함수가 실행되도록 함수를 작성할 수 있다는 점에서 유용
      • 함수의 실행 순서를 보장 받을 수 있는 것은 상당히 중요한 기능, 왜냐하면 이 순서 보장은 비동기 함수의 경우도 포함하기 때문이다.
      • 참조 : https://hcn1519.github.io/articles/2017-09/swift_escaping_closure

      NetworkHandler에서 @escaping Clousre 추가

      스크린 샷과 같이 코드 작성을 하니 문제가 해결되었습니다. 

      회사 내에서 python의 멀티쓰레드와 멀티프로세싱을 조금 다룬 적이 있는 데 언어적인 측면의 차이와 어려운 부분이다 보니 조금 이해하는 데 시간이 조금 오래 걸렸네요.

      • 이 답변은 광현에 의해 4 years, 6 months 전에 수정됐습니다.
      • 야곰
        키 마스터
        • 글작성 : 37
        • 답글작성 : 579

        자문자답 좋아요!ㅎㅎ 게다가 해결한 것도, 공부한 주제도 나이스네요 🙂 최곱니다!

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

logo landscape small

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