본문 바로가기

GCD3

GCD에서 의도치 않은 교착상태를 피하는 법 print("hi \(Thread.current)") // 1 DispatchQueue.global().sync { print("hi \(Thread.current)") // 2 } DispatchQueue.global().async { print("hi \(Thread.current)") // 3 } // 1 - hi {number = 1, name = main} // 2 - hi {number = 1, name = main} // 3 - hi {number = 4, name = (null)} 1번 부분을 보면 메인 스레드에서 실행되고 있음을 알 수 있습니다. 원래 특별한 설정 없는 모든 코드는 메인스레드 위에서 돌아갑니다. 그럼 2번 부분은 왜 메인 스레드에서 처리될까요? 논리적으로는 메인 스레드를 .. 2021. 12. 22.
DispatchQueue 교착상태 Deadlock(교착상태)는 깜직하게도 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)라는 오류를 만들어 앱을 터트립니다. 교착상태를 막아야겠죠? 이런 교착상태가 일어나는 상황을 직렬 큐일 때, 동시 큐일 때로 나누어보면, 1. Serial(직렬) Queue - async 속 sync DispatchQueue.main.async { // main queue == serial DispatchQueue.main.sync { // 교착상황!! } } 해결법 : 다른 큐에서 async로 사용하세요. sync로 하면 교착상태가 또 나니까 주의하세유 -> 참조 : https://gogo-ios.tistory.com/46 DispatchQueue.global().as.. 2021. 12. 22.
DispatchQueue 종류 세 가지 1. Main Queue 2. Global Queue 3. Custom Queue * 디스패치큐는 큐의 특성에 맞게 큐가 알아서 스레드에 자기 task를 분배합니다. 프로그래머는 그저 task를 큐에 넣어주면 됩니다. 1. Main Queue - Serial(직렬) 큐 - 딱 한 개의 큐 - 스레드는 메인스레드 딱 한 개만! (UI 업데이트 처리) 메인 큐는 스레드가 하나밖에 없기 때문에 Serial Queue가 되는 것이 당연합니다. +) 코드를 작성할 때에 별도의 처리를 하지 않는 이상 모든 일들은 메인 스레드가 작업하게 됩니다. 2. Global Queue - Concurrent(동시) 큐 - QoS(Quality of Service)에 따라 6종류로 나뉨 QoS는 작업의 중요도를 결정합니다. 소요.. 2021. 12. 21.