
Mastering Concurrency in iOS - Part 1 (Concurrency, GCD Basics)
Concurrency) 복습Data Inconsistency 문제가 일어날 수 있음Dirty Read ProblemUnrepeatable Read ProblemLost Update ProblemPhantom Read ProblemModern Concurrencyclass CustomThread {
func createThread() {
let thread: Thread = Thread(target: self, selector: #selector(threadSelector), object: nil)
thread.start()
}
@objc func threadSelector() {
print("Custom Thread in action")
}
}
let customThread = CustomThread()
customThread.createThread()
Deallocation)Auto release pool로 커스텀 스레드가 관리되지 않음workers pools에 클로저를 실행하도록 해주는 API 큐OS를 다시 복습하는 듯한 느낌. CS의 기본 역학이 당연히 적용되어 있다는 점에서... 언제나 기본이 중요하다는 것을 느낀다!
Order of Execution: 할당된 작업이 순서에 따라 진행될 것Manner of Execution: 할당된 작업이 어떤 방법으로 실행될 것Synchronous: 동기적. 해당 태스크가 완료될 때까지 실행을 블록시키는 것으로 실행 순서를 보장Asynchronous: 비동기적. 현재 태스크 실행을 지속하면서 동시에 새로운 태스크가 비동기적으로 실행된다는 뜻. Serial Queue: 한 타임 퀀텀에 하나의 태스크 실행Concurrent Queue: 한 타임 퀀텀에 여러 개의 태스크를 실행. 컨커런트한 큐에 있어서도 작업은 FIFO를 지킴 → 디큐되는 순서가 FIFO에 따라 이뤄진다는 뜻destination queue)에 영향을 미치는 데, 해당 큐는 현재 디스패칭하고 있는 큐var counter = 1
DispatchQueue.main.async {
// main queue: Serial Queue
for i in 0...3 {
counter = i
print("counter #: \(counter), current Thread: \(Thread.current)")
}
}
for i in 4...6 {
counter = i
print("counter #: \(counter), current Thread: \(Thread.current)")
}
DispatchQueue.main.async {
counter = 9
print("counter #: \(counter), current Thread: \(Thread.current)")
}
/*
counter #: 4, current Thread: <_NSMainThread: 0x6000021301c0>{number = 1, name = main}
counter #: 5, current Thread: <_NSMainThread: 0x6000021301c0>{number = 1, name = main}
counter #: 6, current Thread: <_NSMainThread: 0x6000021301c0>{number = 1, name = main}
counter #: 0, current Thread: <_NSMainThread: 0x6000021301c0>{number = 1, name = main}
counter #: 1, current Thread: <_NSMainThread: 0x6000021301c0>{number = 1, name = main}
counter #: 2, current Thread: <_NSMainThread: 0x6000021301c0>{number = 1, name = main}
counter #: 3, current Thread: <_NSMainThread: 0x6000021301c0>{number = 1, name = main}
counter #: 9, current Thread: <_NSMainThread: 0x6000021301c0>{number = 1, name = main}
*/
0...3, 9는 순서에 따라 처리되기 때문에 실제 프린트되는 순서는 9가 이후에 오는 게 보장이 됨4...6이 실행되는 구문과 비동기적으로 실행되는 구문을 비교해야 하는 데, 전자가 코드적으로 하단부에 작성되어 있다 할지라도 순서는 보장하지 않음