본문 바로가기

iOS

[iOS] OperationQueue로 비동기 프로그래밍

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와 관련된 코드는 메인 스레드에서 작업해야 한다는 점 잊지 말기 !