Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 애니메이션
- ios
- SWIFT
- 리펙토링
- UITextView
- map
- Refactoring
- MVVM
- collectionview
- uiscrollview
- combine
- 리팩토링
- uitableview
- swift documentation
- swiftUI
- Human interface guide
- Observable
- 스위프트
- Xcode
- HIG
- UICollectionView
- 클린 코드
- tableView
- RxCocoa
- Clean Code
- clean architecture
- Protocol
- rxswift
- ribs
- 리펙터링
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] DispatchQueue, main, global 사용하여 큰 파일 로드 방법 (스레드 처리, sync, async, concurrent, serial) 본문
iOS 기본 (swift)
[iOS - swift] DispatchQueue, main, global 사용하여 큰 파일 로드 방법 (스레드 처리, sync, async, concurrent, serial)
jake-kim 2022. 4. 12. 23:39사전 지식) 스위프트의 스레드
- 스위프트의 main queue는 serial queue이므로, 한 task가 끝나고 난 후에 다음 task를 실행
- 만약 main.sync로 실행시키면 이 serial queue에 작업이 끝날 때 까지 그 코드에 머물러 있는 상태
- queue가 block되고 queue에 넣은 작업들이 완료될때까지 wait 상태
- serial queue이므로 이미 block 상태가 되었기 때문에 deadlock 발생
- thread safe하게 사용하려면, background thread에서 main.async를 사용하여 순서에 맞게 UI업데이트가 되도록 구현
- 크게 main(serial)과 global(concurrent)가 존재
async와 concurrent의 차이
- async, sync
- 단일 작업에 관한 개념
- concurrent, serial
- 앞 작업과 뒷 작업에 관한 개념으로, queue에 사용
ex) 하나의 queue에 sync와 async 작업이 존재할 수 있고,
- sync작업이란 해당 단일 작업이 시작하고 나서 끝날때까지 기다린다는 의미
- concurrent queue란, queue 안에 있는 작업들을 대상으로 순서가 없는 것
- 스위프트에서는 queue관리를 concurrent vs serial 로 수행
- serial queue: task가 수행될 때 queue에 남은 작업들은 wait
- concurrent queue: task가 수행될 때 queue에 남은 작업들은 wait되지 않고 수행
스위프트에서 큰 파일 로드 방법
- 큰 파일을 불러오는 코드를 serial queue인 main스레드에서 하게되면 앞 뒤의 UI 작업들이 잠깐 멈추는 현상이 발생하므로 serial queue가 아닌 concurrent queue에서 실행되게끔 구현
- concurernt queue에서 큰 파일 로드가 끝난 경우, main스레드에서 다시 UI에 접근하도록 구현
ex) 음성 데이터에서 duration값을 얻으려면 많은 시간이 걸리므로, concurrent queue인 global() queue에서 수행 후 main 스레드에서 UI 업데이트
let item = AVPlayerItem(url: musicURL)
self.player.replaceCurrentItem(with: item)
DispatchQueue.global().async {
let totalDuration = CMTimeGetSeconds(item.asset.duration)
DispatchQueue.main.async {
// UI update
}
}
* 참고
https://www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1
'iOS 기본 (swift)' 카테고리의 다른 글
Comments