OperationQueue
Operation Queue는 연산(Operation)의 실행을 관리함
queue에 추가한 동작은 직접 제거할 수 없고, 연산은 작업이 끝날 때까지 대기열에 남아 있음
Canceling Operations
Operation을 queue에서 제거하기 위해서는 operation을 취소해야 함
취소하는 방법
• Operation 객체의 cancel() 메소드를 호출
• OperationQueue의 cancleAllOperations() 메소드를 호출 ➡️ queue에 있는 모든 operation을 취소
실행 중인 operation의 경우, operation 객체의 취소 상태를 확인 ➡️ 실행 중인 operation을 중지하고 완료 상태로 변경
Operation Queue로 비동기 프로그래밍
(동기 프로그래밍 : 안 좋은 예 ..)
let imageURL: URL = URL("~~ img url ~~")
let imageData: Data = try! Data.init(contentsOf: imageURL)
// url로부터 데이터를 가져오는 이 메소드는 동기 메소드 (메인 스레드에서 동작)
// -> 이 작업이 끝나기 전까지는 다음 코드로 넘어가지 않음 -> 앱이 멈추는 것처럼 보임
let image: UIImage = UIImage(Data: imageData)
self.imageView.image = image
이미지 다운로드 버튼을 누르면, 버튼이 눌린 채로 멈춰 있고 이미지를 가져올 때까지 아무런 작업을 할 수 없음
⬇️
let imageURL: URL = URL("~~ img url ~~")
// 메인 스레드가 아닌 다른 스레드에서 동작
// 데이터만 관리하기 때문에 UI에 미치는 영향 X
OperationQueue().addOperation {
let imageData: Data = try! Data.init(contentsOf: imageURL)
let image: UIImage = UIImage(Data: imageData)
OperationQueue.main.addOperation {
self.imageView.image = image
// UIImageView.image must be used from main thread only
// -> UI와 관련된 코드는 메인 스레드에서 !
}
}
imageData를 가져오는 작업은 스레드를 만들어서 백그라운드에서 작업하도록 함
이 작업이 끝나면, 메인 스레드로 가져와서 코드 실행 (다운받은 이미지를 화면에 띄워줌)
-> 이미지 다운로드 버튼을 누르고, 이미지를 가져오는 동안 앱이 멈춘 것처럼 보이지 않음
(계속 버튼을 클릭하는 등 이미지를 가져오는 동안 다른 작업 가능)
UI와 관련된 코드는 메인 스레드에서 작업해야 한다는 점 잊지 말기 !
'iOS' 카테고리의 다른 글
[iOS] DispatchQueue로 비동기 프로그래밍 (0) | 2020.06.08 |
---|---|
[iOS] 서버에 데이터 요청하기 : URLSessionDataTask (0) | 2020.06.08 |
[iOS] URLSession과 URLSessionDataTask (0) | 2020.06.08 |
[iOS] Grand Central Dispatch (GCD) (0) | 2020.06.08 |
[iOS] 비동기 프로그래밍과 동시성 프로그래밍 (0) | 2020.06.08 |