๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ํด apple์์๋ GCD๋ผ๋ ๊ฒ์ ์ ๊ณตํ๋ค๋ ์ฌ์ค์ ์ด์ ์ฐ๋ฆฌ๋ ์๊ณ ์๋ค. ๊ทธ๋ฐ๋ฐ, ์ด์ธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ๋ ๋์๋ค. ๋ฐ๋ก Operation Queue์ด๋ค. ์กฐ๊ธ๋ ๊ณ ์์ค์ API๋ก ์ค๊ณ๋ Operation Queue๋ ๋ณต์กํ ์์ ๋ค์ ์ํํ ๋ ๋ง์ด ์ฌ์ฉํ๊ณค ํ๋ค. ๊ทธ๋ผ, ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์ฅ์ ์ด ์๋์ง ํ์ธํด๋ณด๋๋ก ํ์.
ํด๋น ๊ธ์ ์ฌ๋ด ๋ฐํ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ต๋๋ค.
Operation Queue
GCD๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ Objective-c class๋ก, ๊ณ ์์ค์ DispatchQueue์ด๋ค.
GCD์ ๋ง์ฐฌ๊ฐ์ง๋ก Thread ์ง์ ์์ฑ ๋์ , ํน์ ์์ ์ ์ ์ํ๊ณ Queue์ ์ ์ถํ์ฌ ์์คํ ์ด ์ด๋ฅผ ์ํํ๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. Operation์ด๋ผ๋ ํด๋์ค๋ฅผ ํตํด ์ํํ ์์ ์ ์ ์ํ๊ณ , OperationQueue์ ์ ์ถํ๋ฉด, Operation ๊ฐ์ฒด์ ์ฐ์ ์์ ๋ฐ ์ค๋น ์ํ์ ๋ฐ๋ผ ๋๊ธฐ์ค์ธ Operation์ ์คํํ๋ค. ์๋นํ DispatchQueue์ ์ ์ฌํจ์ ์ ์ ์๋ค.
DispatchQueue์ ๋ค๋ฅธ ์ ์, ๋์์ ์คํํ ์ ์๋ Operation์ ์ต๋ ๊ฐฏ์๋ฅผ ์ง์ ํ ์ ์๋ค๋ ์ ์ด๋ค. ๋ํ ์์ง ์คํ์ด ๋์ง ์์ Operation์ ๋งค์ฐ ์ฝ๊ฒ ์ทจ์ํ ์ ์๋ค. GCD์ ๊ฒฝ์ฐ, DispatchWorkItem์์ cancel ๋ฉ์๋๋ฅผ ํ์ฉํ์๋ค. ์ฆ ํด๋น Item์์ ์ ๊ทผํ์ด์ผ ํ๋๋ฐ, Operation Queue์ ๊ฒฝ์ฐ queue.cancelAllOperations()
๋ผ๋ ๋ฉ์๋๋ก ํ๋ฒ์ ๊ฐ๋ฅํ๋ค.
Operation Queue ์์ฑ ๋ฐฉ๋ฒ์ GCD์ ๋ง์ฐฌ๊ฐ์ง๋ก 2๊ฐ์ง๊ฐ ์๋ค.
-
Main Queue
OperationQueue.main
- main thread ์คํ
-
Concurrent Queue (Default)
maxConvurrentoperationCount
๋ณ์์ ์ซ์๋ฅผ ๋ฃ์ผ๋ฉด ํ๋ฒ์ n๊ฐ์ฉ ๋น ์ ธ๋๊ฐ๊ฒ ๋๋ค.maxConvurrentoperationCount
๋ฅผ 1๋ก ์ค์ ํ๋ฉด serial Queue์ ๋์์ ํ๊ฒ๋๋ค.
Operation ์ถ๊ฐ์ ๊ฒจ์ ์๋์ ๊ฐ์ API๊ฐ ์๋ค.
KVO-Compliant Properties
OperationQueue ํด๋์ค๋ ์ฌ๋ฌ Property์ ๋ํด Key-value Coding ๋ฐ Key-value Observing์ ์ค์ํ๋ค. KVO๋ ์ดํ ์์๋ณด๊ณ , ์ผ๋จ ๊ฐ๋ฅํ property๋ฅผ ๋ณด๋ฉด
- operations:
Deprecated- ๋ค์ด๊ฐ ์๋ Operation๋ค
- operationCount:
Deprecated- Operations์ ๊ฐ์
- maxConcurrentOperationCount: readable, writeable
- ๋์์ ์คํํ ์ ์๋ ์ต๋ ์์ ์
- isSuspended: readable, writeable
- Queue์ ์ผ์ ์ค๋จ ์ฌ๋ถ
- name: readable, writable
- ํด๋น Queue์ ์ด๋ฆ
OperationQueue์ issuspended Property๋ฅผ ๊ด์ฐฐํ ์ ์๋ค.
Key-Value Coding (KVC)
๋ฌธ์์ด ์๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ๊ฐ์ ์ ์ผ๋ก ์ก์ธ์คํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ
objective runtime์ ์์กดํ๊ธฐ ๋๋ฌธ์ NSObject
์์๊ณผ, @objc
annotation์ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
๋ฌธ์์ด๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์๊ฒ ์ง๋ง ๋ฐํ์์ผ๋ก ์ฒ๋ฆฌํ๋ค. ๊ทธ๋์ ์๋นํ ์ ์ฐํ๋ค. ๋ฐ๋๋ก ๋งํ๋ฉด ์ค๋ฅ๊ฐ ๋ ๊ฐ๋ฅ์ฑ๋ ๋๋ค.
Key-Value Observing (KVO)
๋ค๋ฅธ ๊ฐ์ฒด์ ํน์ ํ๋กํผํฐ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆผ ๋ฐ์ ์ ์๋ ๋ฉ์ปค๋์ฆ
KVC๋ฅผ ์ฌ์ฉํ์ฌ objective-c runtime์์ ๊ฐ์ ์ ์ผ๋ก ํน์ property์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์, NSObject
์์๊ณผ, @objc
, dynamic
annotation์ ๋ถ์ฌ์ ๋ฐํ์์ ๋
ธ์ถ ์์ผ์ผ ํ๋ค.
observe
๋ฉ์๋๋ฅผ ํตํด์ ๋ณ๊ฒฝ์ ์๋ฆผ ๋ฐ๊ณ ์ถ์ ๋ณ์๋ฅผ ๋ช
์ํ๊ณ , ์ฝ๋ฐฑ์ผ๋ก ์ ์ํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
Operation
์ํํ๋ ค๋ ์์ ์ ์บก์ํํ๋ Objective-C ๊ธฐ๋ฐ ์ถ์ ํด๋์ค
์ถ์ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ์ง์ ์ฌ์ฉํ์ง ๋ง๊ณ Subclass๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์์คํ ์ ์ Subclass ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- BlockOperation
- Subclassing
OperationQueue์ ํจ๊ป ์ฌ์ฉํ๊ฑฐ๋, ๋จ๋ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ sync(default), async๋ก ์คํ๋๋๋ก ์์ ์ค๊ณ๊ฐ ๊ฐ๋ฅํ๋ค.
KVO-Compliant Properties
Operation ํด๋์ค๋ ์ฌ๋ฌ Property์ ๋ํด KVC ๋ฐ KVO๋ฅผ ์ค์ํ๋ค.
- isCancelled: read-only
- isAsynchronous: read-only
- isExecuting: read-only
- isFinished: read-only
- isReady: read-only
- dependencies: read-only
- queuePriority: readable, writable
- completionBlock: readable, writable
Operation Life Cycle
- pending
- Ready
- Executing
- Finished
- Cancelled
- Bool Property
cancel ์ดํ์๋ startํ๋๋ผ๋ ๊ฐ์ด ์คํ๋์ง ์๋๋ค.
Block Operation
ํ๋ ์ด์์ ๋ธ๋ก ๊ฐ์ฒด์ ๋ํ Wrapper ์ญํ ์ ํ๋ Operation์ Subclass
Operation์ ๋จ๋ ์ผ๋ก ์ฐ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก sync๋ก ๋์๊ฐ๋ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์ฐจ์ ์ผ๋ก 1, 2, 3์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์ฆ, ๊ฐ๊ฐ์ ์ ์ด๊ถ์ ๋ด๋์ง ์๋๋ค.
addExecutionBlock
๋ฉ์๋๋ฅผ ํตํด ๋ ๋ง์ ๋ธ๋ญ์ ์ถ๊ฐํ ์ ์๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์ถ๊ฐ๋ ๊ฐ block๋ค์ Concurrentํ๊ฒ ๋์ํ๋ค. ์ฆ, ํด๋น ์์ ์ ๊ฒฐ๊ณผ๋ 1, 2์ ์์ ๋ณด์ฅ์ด ์๋๋ค.
Custom Operation
Operation ํด๋์ค์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์คํ ๋ฐฉ๋ฒ์ ๋ํ ์ปค์คํ ๋ก์ง์ ์ ๊ณต
Non-Concurrent Operation
Operation์ ์์ํ๊ณ , main method ํ๋๋ง์ overrideํ๋ฉด ๋๋ค.
Concurrent Operation
Operation์ ๋จผ์ ๋น๋๊ธฐ๋ก ์๋ํ ์ ์๊ฒ ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค.
- isAsynchronous
- isExecuting
- isFinished
- start()
์ 4๊ฐ์ ํ๋กํผํฐ ํน์ ๋ฉ์๋๋ฅผ overrideํด์ผ ํ๋ค. ์์ 3๊ฐ์ property์ ๊ฒฝ์ฐ KVO๋ฅผ ์ง์ํ๋๋ฐ, ๊ฐ์ด ๋ณํํ ๋ ์ด๋ฅผ ์๋ ค์ฃผ๋ notification์ ๋ง๋ค์ด์ผ ํ๋ค.
property override์ getter, setter๋ฅผ ๊ฐ์ง๊ณ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ , ๊ฐ์ ธ์์ผ ํ๋ค. ๊ทธ๋์ ์ ๋ ๊ฒ ์์ฑํ ๊ฒ. ์ด๋ ๊ฒ ๋ง๋ค์ด๋๊ณ ์ค์ ์ฌ์ฉ์ ์ด๋ป๊ฒ ํ ๊น?
start
ํจ์ ์์ main ํจ์๋ฅผ ์คํํ๋๋ก ๋์ด ์์ผ๋, ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ฝ๋๋ main ํจ์๋ฅผ overrideํ์ฌ ์ ์ํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
Operation Dependency
ํน์ ์์๋ก Operation์ ์คํํ๋ ๋ฐฉ๋ฒ
Operation A โ Operation B
operation B๊ฐ operation A์ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์ค์ ํด๋ณด์.
์ ์ํด์ผ ํ๋ ์ ์ ์ข ์(A) Operation์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์๋์ง, ํน์ ์คํจ๋์๋์ง ๊ตฌ๋ถํ์ง ์๋๋ค๋ ์ ์ด๋ค. ์ฆ, A์ ์์ ์ด ์ฑ๊ณต์ธ์ง ์คํจ์ธ์ง์ ๊ด๊ณ ์์ด B๊ฐ ์คํ๋๋ค. ๋ ์ทจ์ํ ๊ฒฝ์ฐ๋ ์๋ฃ๋ก ํ์๋๋ค.
๋ง์ฝ์ ์ข ์ Operation์ด ์ทจ์๋๊ฑฐ๋ ํน์ ์คํจํ ๊ฒฝ์ฐ ํ์ Operation์ ๋์์ ์ ํ๊ณ ์ถ๋ค๋ฉด ๋ณ๋๋ก ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
RandomNumber๋ฅผ ๋ง๋ค๊ณ , ํด๋น ๊ฐ์ ๋ค์ Operation์ ๋๊ฒจ Printํ๋๋ก ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋ณด์.
RandomNumberOperation์ ๊ฐ์ ๋ง๋ค๊ณ , PrintOperation์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์ถ๋ ฅํ๋๋ก ๋์ด ์๋ค. ์ด๋ป๊ฒ ์ฐ๊ฒฐํ๊ณ ๊ฐ์ ๋๊ธธ ์ ์์๊น?
Completion Block ์ฌ์ฉ
- Completion Block์ ์์ฑํ๋ค.
- ์ด ๊ฒฝ์ฐ ์ unowned๋ฅผ ์ฌ์ฉํ์์๊น..?
- ์์ฑํ์ฌ ์ข ์ Operation์ property๋ก ๋ฃ์ด๋๋ค.
- ์์กด์ฑ ๊ด๊ณ๋ฅผ ์์ฑํ๋ค.
- ํ์ ์์๋๋ก ์์ ์ ๋ฃ๋๋ค.
Adapter Operation ์ฌ์ฉ
adapter pattern์ ๋ง๊ทธ๋๋ ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ ๋, ์ฐ๊ฒฐํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. Operation์ ํ๋ ๋ง๋ค๊ณ , ์ด ์ฌ์ด์์ ์๋ก์ ์์กด์ฑ์ ์ฐ๊ฒฐํ๋ค.
randomNumberOperation <- adapter <- printOperation
์ด ๋ฐฉ๋ฒ ์ญ์ ์ํ์ฐธ์กฐ๋ฅผ ํญ์ ์กฐ์ฌํด์ผ ํ๋ค.
Operation Priority
Operation Queue ๋ด์ ํ์ฌ ์ค๋น๋ Operation์ ์คํ ์์ ์์๋ฅผ ์ ํ ์ ์๋ค.
ํ์ ์ถ๊ฐ๋ ์์ ์ ๊ฒฝ์ฐ, ๋จผ์ operation์ ์ค๋น ์ํ์ ๋ฐ๋ผ ์คํ ์์๊ฐ ๊ฒฐ์ ๋ ๋ค์ ์๋์ ์ฐ์ ์์์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
์ฌ๊ธฐ์ ์์๋์ด์ผ ํ ์ ์, ์ฐ์ ์์๊ฐ ์ข ์์ฑ์ ๋์ฒดํ์ง๋ ์๋๋ค๋ ์ ์ด๋ค. ์ฐ์ ์์ ๊ฐ์ ์ฌ์ฉํด์ ์๋ก๋ค๋ฅธ Operation์ ์์๋ฅผ ๊ด๋ฆฌํ๋ฉด ์๋๋ค. ์ข ์์ฑ์ด ์๋ Operation์ ๋ํด์๋ง ์๋์ ์ฐ์ ์์ ๋ถ๋ฅ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ ์ฌ์ฉํด์ผ ํ๋ค.
C, B, A ์์ผ๋ก Operation์ด ์คํ๋๋ค. Serial Queue์ด๊ธฐ ๋๋ฌธ์ ์ผ๊ด๋ ๊ฒฐ๊ณผ๊ฐ ๋์ถ๋๋ค.
Quality of Service
apple์ด ์ ๊ณตํ๋ ์์ ์ ๋ช ์์ ์ธ ๋ถ๋ฅ
์ด์ ์ GCD์์๋ ์ ๊ณต๋์๋ ๊ฐ๋ ์ด๋ค.
- User Interactive
- User Initiated
- Utility
- Background
์ด๋ฐ์์ผ๋ก operation์ property๋ก ์ง์ ํ ์ ์๋ค. ํน์
์ด๋ ๊ฒ queue ์์ฒด์ ์ง์ ํ ์๋ ์๋ค. ์ฆ operation ์์ฒด์ ์ง์ ํ๋ฉด OS์์ ์ง์ ํ Queue๋ก ๋ค์ด๊ฐ๊ณ , Queue์ ์ค์ ํ๋ฉด ๊ทธ๋ฌํ ํ๊ฐ ์์ฑ๋์ด ๋์ํ๊ฒ ๋๋ ๊ฒ.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ์, Queue์ ์ง์ ๋ QoS๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ Operation์ด ๋ค์ด๊ฐ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ํฉ | ๊ฒฐ๊ณผ |
---|---|
Queue์ ํ ๋น๋ Qo | |
Queue QoS ํ ๋น ์ฌ๋ถ ๋ฐ ์๋์ ์ฐ์ | Operation QoS ํ ๋น ์ฌ๋ถ ๋ฐ ์๋์ ์ฐ์ | ๊ฒฐ๊ณผ |
---|---|---|
X | O | ์๋ฌด ์ํฅ ์์. Operation์ ์ง์ ๋ QoS๋ก ๋์ |
O (Low QoS) | O (High QoS) | Queue์ QoS ์น๊ฒฉ Queue ๋ด๋ถ Operation QoS ์ญ์ ์น๊ฒฉ |
O (Low โ High๋ก ๋ณ๊ฒฝ) | - (ํ ๋น ๋์์ ์๋ ์๋์์ ์๋) | QoS๊ฐ ๋ฎ์ Queue ๋ด๋ถ Operation์ ๋ชจ๋ ์น๊ฒฉ |
O (High โ Low๋ก ๋ณ๊ฒฝ) | - | ๊ธฐ์กด์ Queue ๋ด๋ถ Operation์ ๋ฐ์๋ฐ์ง ์์ ์๋ก ์ถ๊ฐ๋๋ Operation์๋ง ๋ฐ์ |
GCD vs OperationQueue
์์ ์ ๋ณต์ก๋์ ๋ฐ๋ผ์ ์ ํ
- ๋จ์ํ block์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ: DispatchQueue
- ์์ ์ ์ข ์์ฑ, ์ทจ์ ๋น๋ฒ: Operation, OperationQueue
์ ๋ฆฌ
- OperationQueue ์ญ์ Serial, Concurrent๊ฐ ์๋ค.
- maxConcurrentOperationCount๋ฅผ ํตํด ๋ณ๊ฒฝํ ์ ์๋ค.
- Operation์ Block Operation์ ์ฌ์ฉํ๊ฑฐ๋ Operation์ Subclassingํ์ฌ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- Operation Life Cycle์ด ์๊ณ , ์ทจ์, ์คํ์ค ๋ฑ์ ์ํ๊ฐ ์๋ค.
- KVO, KVC๋ฅผ ์ง์ํ๋ค. (OperationQueue, Operation)
- Operation Dependency๋ฅผ ๊ฐ์ ธ์, Operation๊ฐ์ ์ข ์์ฑ์ ์ค์ ํ ์ ์๋ค.
- ์ฐ์ ์์ ๋ํ ์ค์ ๊ฐ๋ฅํ๋ฉฐ, ๋ค๋ง ์ฐ์ ์์๊ฐ ์ข ์์ฑ์ ๋์ฒดํ์ง๋ ์๋๋ค.
- DispatchQueue์ ๊ฐ์ด QoS๋ฅผ ์ง์ํ๋ค.