요즘 swift3 관련해서 여러가지 찾아보고 있는데요.
그중에 GCD 관련 좋은 한번 짚고 넘어가보고자 합니다.
왜냐하면 swift3 에서 gcd 관련 문법과 사용예가 많이 개선되었다고 하네요.
바쁘신 분들을 위해 요약 먼저 공유합니다.
GCD 사용시, 큐먼저선택 > dispatch method 선택(sync, async) (기존은 반대였음: dispatch method 선택 > 큐선택)
QoS 등장과 기존의 DISPATCH_QUEUE_PRIORITY의 몰락
Work items에서도 QoS사용
dispatch_time_t 가 훨씬 쉬워짐
dispatchPrecondition 이 dispatch_assert을 대체
기존에는 dispatch 메소드(async vs sync)를 선택한후 큐를 선택해서 태스크를 할당했었는데요.
업데이트된 GCD 에서는 이순서가 바뀌었습니다.
먼저 큐선택후 dispatch 메소드 선택
GCD로 가장 많이 쓰이는 패턴이 백그라운드에서 태스크 실행후, UI 업데이트를 main Thread에서 하는 형태인데요.
새로 바뀐 형태에서는 어떻게 쓰이는지 보면 아래와 같습니다.
위의 사용예에서 보면 큐에서 attributes를 받는 것을 확인 할수 있는데요.
attributes에는 다양한 OptionSet을 받을수가 있습니다.
serial vs. concurent
memory and activity management options
quality of service(.default, .userInteractive, .userInitiated, .utility, .background)
여기서 quality of service(QoS)는 기존의 priority pattern 을 대체할 녀석입니다. 기존의 priority 는 iOS8 부터 deprecated 되었습니다.
기존의 priority 와 어떻게 매핑되는지 보면 아래과 같이 됨을 알수가 있습니다.
DISPATCH_QUEUE_PRIORITY_HIGH: .userInitiated
DISPATCH_QUEUE_PRIORITY_DEFAULT: .default
DISPATCH_QUEUE_PRIORITY_LOW: .utility
DISPATCH_QUEUE_PRIORITY_BACKGROUND: .background
memory and activity management options 같은 경우에는 애플의 새OS들을 위한것인데요.
(새OS들: OSX 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0)
.initiallyInactive를 사용하여 비활성 상태에서 큐를 시작하게 한다던지, .autoreleaseInherit, .autoreleaseNever and .autoreleaseWorkItem를 사용해여 커스텀된 오토릴리즈를 설정할 수 있다고 합니다.
optionSet들이 큐 말고도 workItem이란 것에도 적용이 되는데요.
workitem은 생성시 QoS 와 flag를 설정할수가 있습니다.
여기서 flag는 아래와 같은 옵션들이 있습니다.
barrier, detached, assignCurrentContext, noQoS, inheritQoS, enforceQoS
dispatch_time_t 는 특정시간을 UInt64 형태로 전환해주는 함수입니다. 업데이트된 GCD 에서는 기존보다 더 친화적인 문법을 보여줍니다(기존의 NSEC_PER_SEC이 그리 친화적인것 같아 보이진 않았습니다).
dispatch after 예를 들면 아래와 같습니다.
여기서 .seconds 는 DispatchTimeInterval 이란 새로운 enum 인데요.
아래와 같은 케이스들을 제공하고 있습니다.
.seconds(Int)
.milliseconds(Int)
.microseconds(Int)
.nanoseconds(Int)
올해 새로 소개된 apple OS 에는 dispatch precondition 이란 녀석을 새로 선보였는데요.
이것은 기존의 dispatch_assert 를 대체할 예정이고, 또한 사용자가 코드 실행전 원하는 스레드에 있는지 확인할수 있게 합니다. 이것은 UI 업데이트와 같이 메인스레드에서 실행되야하는 함수사용에 매우 유용해보입니다.
아래는 사용예입니다.
GCD 사용시, 큐먼저선택 > dispatch method 선택(sync, async) (기존은 반대였음: dispatch method 선택 > 큐선택)
QoS 등장과 기존의 DISPATCH_QUEUE_PRIORITY의 몰락
Work items에서도 QoS사용
dispatch_time_t 가 훨씬 쉬워짐
dispatchPrecondition 이 dispatch_assert을 대체
참고)
https://medium.com/swift-and-ios-writing/a-quick-look-at-gcd-and-swift-3-732bef6e1838#.28bwxuvvf
https://developer.apple.com/videos/play/wwdc2016/720/