Swift TIL(47)

웰디(Well-D)·2023년 10월 11일
0

Sweet & Soft, SWIFT

목록 보기
45/76
post-custom-banner

복습

비동기 / 동기프로그래밍 동시성/직렬과 함께한 하루

역시 재밌고, 다들 참 머리도 좋아 이런생각이 드는 파트다. 그리고 스위프트 5.5부터 async await가 도입되어서 반가웠고, 하지만 기존에 사용하던콜백함수 리턴 및 호출도 논리적이고, 또 여태까지 자주쓰였기 때문에 필수적으로 잘 써야할듯

가볍게 정리

기초

  • 코어와 쓰레드는 다르다. 과거에 하이퍼쓰레딩기술로 1코어당 2쓰레드로 늘릴 수 있는데, 이때의 쓰레드는 물리적인 쓰레드를 의미한다.
  • 물리적쓰레드는 또다시 일종의 객체인 소프트웨어 쓰레드(객체)로 나뉘고, 이 소프트웨어적 쓰레드가 통칭 '쓰레드'라고 불리는 개념이다.
  • 싸이클 두가지 : 업데이트 싸이클(60hz)와 무한루프인 이벤트처리를 핸들링하는 메인루프(runloop-앱시작시 발동/3.5Ghz)

동시성과 병렬

  • 동시성프로그래밍 : ios에서는 Task들을 Queue로 보내주기만 하면(어떤Queue인지는 명시) 알아서 동시적처리를 해준다(분산처리) 이를통해 쉽게 비동기적으로 작업이 처리되도록 함 / 보통 Queue에 들어오는 즉시 쓰레드를 추가생성해서 보내주는 방식

  • 병렬 : 위의 동시성프로그래밍과 다른 개념으로 물리적인 쓰레드하나에서 동시에 일처리(신경쓸필요는 없음)

  • Queue:DispatchQueue 일명 GDC(privateQueue직렬큐 / global() 6종류 / main)와 OperationQueue

비동기와 동기

  • 비동기 : 메인쓰레드가 아닌 다른쓰레드에 Task를 보내고 결과를 기다리지않는다(즉시리턴) => 결과적으로 나중에 내 Task종료시점을 알기위해 클로저를 사용하거나 5.5버전부터 async await을 사용함

  • 동기 : Task를 보내고 결과를 기다린다(느림) 순서가 생김 / 드물게사용

직렬과Queue 동시Queue

  • 직렬Queue : Task를 보낼 멀티쓰레드가 하나쓸때 (async를 해도 결과적으로는 동기sync처럼 동작한다)
  • 동시Queue : Task를 보낼 멀티쓰레드를 2개이상 쓸때

GDC DispatchQueue

  • 메인큐 .main => 메인쓰레드와 동일시 / 직렬

  • 글로벌큐 .global() / 동시 / qos에 따라 6종류 (.default / .utility 자주사용)

  • 프라이빗큐 (label:"") / 직렬(default, attribute로 동시로 속성 변경가능)

  • UI관련작업은 다시 main큐로 올려줘야함(내부에서 DispatchQueue.main.async로 감싸기

  • 올바르게 completionHandler 즉 콜백함수 사용하기 : 리턴형을 그대로 써주지말고 콜백함수로 해당 함수의 리턴형을 받은뒤 콜백함수를 호출해서 사용해야함 / 비동기시간을 기다릴 수 있게 됨 / 함수실행시 클로저에 코드를 작성

  • 객체내 비동기 코드사용시 async{}클로저가 약하게 가르킬 수 있도록, 약한참조를 권장([weak self] 캡쳐메모리+weak키워드) => 옵셔널 unwrapping필요 기억하기

  • 동기함수를 비동기함수로 구현할때는 비동기함수(큐의 클로저)로 감싼다. 만약 동기함수에 리턴형이 있었다면 당연히 콜백함수로 구현

  • URLSession같은경우 비동기적으로 구현되어있다

  • 동시성프로그래밍의 문제인 경쟁상황(ThreadSafe하지않음/RaceCondition)과 교착상태(DeadLocks)로 인한 문제 => ThreadSafe를 위해 동시에 공유데이터 영역에 접근해야하는 동시큐의 메서드들은 직렬큐로 보내서 순서를 만들어주는 방법사용가능 (직렬큐의 클로저로 감싸준다)

profile
Wellness 잘사는 것에 진심인 웰디입니다. 여러분의 몸과 마음, 통장의 건강을 수호하고싶어요. 느리더라도, 꾸준히
post-custom-banner

0개의 댓글