Mastering Concurrency in iOS - Part 1 (Concurrency, GCD Basics)
Concurrency
) 복습Data Inconsistency
문제가 일어날 수 있음Dirty Read Problem
Unrepeatable Read Problem
Lost Update Problem
Phantom Read Problem
Modern Concurrency
class 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
이 실행되는 구문과 비동기적으로 실행되는 구문을 비교해야 하는 데, 전자가 코드적으로 하단부에 작성되어 있다 할지라도 순서는 보장하지 않음