• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

통신을 그룹으로 묶어서 for문 돌리는 부분 질문이요!

20.08.05 22:20 작성 조회수 164

1

* 반복적으로 비동기 함수들을 for문을 통해 실행을 시킬 때, completion부분에서 downloadedImages 배열에 append 시키는 부분이 있는데, downloadedImages배열 접근 시점이 비슷해도 append 메소드는 상관이 없이 다 더해지나요?

답변 1

답변을 작성해보세요.

1

안녕하세요! 창민 님! 좋은 질문 감사드립니다. :)

실제로 배열은 Thread-safe하지 않다는 사례가 아래와 같이 많이 있습니다. 

https://basememara.com/creating-thread-safe-arrays-in-swift/

https://stackoverflow.com/questions/28784507/adding-items-to-swift-array-across-multiple-threads-causing-issues-because-arra

또, 구글에서 swift + array + thread-safe와 같은 단어들만 조합해서 찾아봐도 실제로 창민 님이 말씀하신 사례들은 많이 찾으실 수가 있고요. 

실제로 위와 같은 thread-safe하지 않은 모든 가능성을 배제하려면

append함수 같은 경우는 다시 serial큐로 보내는 것을 권장한다는 내용도 WWDC에서 다루었던 것으로 기억하고 있습니다.

(이 자료를 제가 본 기억이 있는데.. 지금 찾을 수가 없네요.ㅠ)

그래서, 수업에서 다루었던 시리얼큐, 배리어, 세마포어 등을 이용하셔도 무방할 것이라고 생각됩니다. 이것이 "이론적으로는" thread-safe하게 배열을 다루는 방법이 맞다고 생각됩니다.

다만, (실질적으로? 실무적으로?) 아주 빠른 시간(밀리미초 이내?)에 배열에 동시에 접근하지 않지 않으면 염려하시는 일은 잘 일어나지 않으리라고 생각 됩니다. 만약 배열에 접근하는 시점이 for문에서 시작점이라면 동시에 밀리미초 이내에 접근할 가능성이 있기에 염려스럽지만, 이미지를 다운로드 하고 완료 시점이 for문의 시작점보다는 (그렇게 빠른 시간내에 일어날 것 같지는 않기 때문에..) 크게 신경을 쓰지 않아도 될 것 같다는 것이 제 뇌피셜 입니다...

결론은.. 이론적으로 Thread-safe하지 않은 모든 가능성을 배제한 코드를 작성하려면, 시리얼 큐 등의 방법을 쓰는 것이 올바르고 다운로드 작업의 완료 성격을 봤을때 실질적으로 무방할 것 같다라고 생각이 든다는 것입니다.

생각하신 질문에 올바른 답변이 되었길 바라며.. 혹시 다시 궁금하시면 다시 질문 남겨주세요 ^^

감사합니다. :)