고수님들 도와주세요 ㅠㅠㅠ

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

      스크린샷 2022-01-28 오후 5.37.37제가 위 함수를 이용해서 [Member]를 [MemberModel]로 바꾸어 return하는것을 구현하고자하는데 fetchImage클로저까지는 memberModels를 출력해도 append한대로 잘 출력이 되는데 member.map부터는 append한 요소는 다 사라지고 빈 배열이 출력되더라구요, 제가 부족하여 아무리 해봐도 해답을 모르겠는데 혹여 제가 놓치고 있는 부분이 있을까요 ??ㅠㅠㅠ

    • rhrnakrnakr
      참가자
      • 글작성 : 0
      • 답글작성 : 40

      음… 고수도 아니고 문제를 정확히 파악할 수 없어서 조심스럽습니다만… 지레짐작하건데 fetchImage라는 이름에서 해당 함수 내부에서 네트워크를 통해 통신을 하고 있다고 생각됩니다.
      만약 그렇다고 한다면 fetchImage에 넘겨주는 후행클로저는 서버에서 응답이 잘 도착한 경우에만 실행이 되는데

      첫번째로 이게 비동기로 동작을 해서 parseData는 빈 memberModels를 리턴하고,

      두번째로 후행클로저는 선언 당시의 memberModels를 캡쳐하는데 이때 memberModels는 값타입인 Array이기 때문에 값이 복사가 되어서, parseData에서 리턴이 된 memberModels와 후행클로저에서 캡처한 memberModels가 서로 다른 배열이 되어서 그런 게 아닐까 생각합니다.

      틀릴 수도 있으니 후행클로저 내에서 memberModels의 레퍼런스와 실제로 사용하는 곳에서의 memberModels의 레퍼런스를 비교해보시면 좋을 것 같습니다

      제가 문제를 바르게 인식했다면… 값타입과 참조타입, 동기와 비동기, @escaping closure와 capture list에 대해서 공부를 해보시면 도움이 될 것 같습니다.

      • 이 답변은 rhrnakrnakr에 의해 2 years, 9 months 전에 수정됐습니다.
    • kilee124
      참가자
      • 글작성 : 3
      • 답글작성 : 4

      아아 말씀하시는게 fetchImage함수의 클로저에서 캡처된 memberModels가 클로저실행시점에 값이 평가되어지는데 이때 값타입이라서 실제 memberModels는 변하지않았다는거군요 ?? 그렇다면 어떻게 MemberModel배열을 넘겨줄 수 있을까요…? fetchImage함수에 대한 결과를 트레일링클로저가 아니라 리턴값을 넘겨주는것도 GCD로 묶여있어서 안되서요 ㅠㅠㅠ 

    • rhrnakrnakr
      참가자
      • 글작성 : 0
      • 답글작성 : 40

      memberModels가 지금 함수 내의 지역변수인데, 조금 더 글로벌하게 만들어서 타입 내의 프로퍼티 같은 것으로 만든다면 쉬울 거 같아요.

      반드시 리턴을 통해 구현을 하고 싶으시다면  Swift Concurrency나 DispatchSemaphore가 도움이 될 수 있을 거 같습니다

       

      컨커런시

      세마포어

       

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

logo landscape small

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