비동기 / 동기프로그래밍 동시성/직렬과 함께한 하루
역시 재밌고, 다들 참 머리도 좋아 이런생각이 드는 파트다. 그리고 스위프트 5.5부터 async await가 도입되어서 반가웠고, 하지만 기존에 사용하던콜백함수 리턴 및 호출도 논리적이고, 또 여태까지 자주쓰였기 때문에 필수적으로 잘 써야할듯
가볍게 정리
동시성프로그래밍 : ios에서는 Task들을 Queue로 보내주기만 하면(어떤Queue인지는 명시) 알아서 동시적처리를 해준다(분산처리) 이를통해 쉽게 비동기적으로 작업이 처리되도록 함 / 보통 Queue에 들어오는 즉시 쓰레드를 추가생성해서 보내주는 방식
병렬 : 위의 동시성프로그래밍과 다른 개념으로 물리적인 쓰레드하나에서 동시에 일처리(신경쓸필요는 없음)
Queue:DispatchQueue 일명 GDC(privateQueue직렬큐 / global() 6종류 / main)와 OperationQueue
비동기 : 메인쓰레드가 아닌 다른쓰레드에 Task를 보내고 결과를 기다리지않는다(즉시리턴) => 결과적으로 나중에 내 Task종료시점을 알기위해 클로저를 사용하거나 5.5버전부터 async await을 사용함
동기 : Task를 보내고 결과를 기다린다(느림) 순서가 생김 / 드물게사용
메인큐 .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를 위해 동시에 공유데이터 영역에 접근해야하는 동시큐의 메서드들은 직렬큐로 보내서 순서를 만들어주는 방법사용가능 (직렬큐의 클로저로 감싸준다)