[swift] Operation을 이용한 비동기 작업 처리

앱을 개발하다 보면 네트워크 요청이나 파일 다운로드와 같은 비동기 작업을 처리해야 하는 경우가 많습니다. 이러한 작업을 보다 효율적으로 관리하기 위해 Operation과 OperationQueue를 사용할 수 있습니다.

Operation

Operation은 직렬 또는 병렬로 실행할 수 있는 작업의 추상화된 표현입니다. Operation 클래스는 추상 클래스이므로 직접 인스턴스를 생성할 수 없습니다. 대신에 이 클래스를 서브클래싱하여 비동기 또는 동기적으로 실행될 작업을 정의할 수 있습니다.

예를 들어, 파일 다운로드나 이미지 처리와 같은 작업을 Operation의 서브클래스로 정의하여 실행할 수 있습니다.

class ImageDownloadOperation: Operation {
    var imageURL: URL
    var completion: ((UIImage?) -> Void)?

    init(imageURL: URL, completion: ((UIImage?) -> Void)?) {
        self.imageURL = imageURL
        self.completion = completion
    }

    override func main() {
        // 이미지 다운로드 및 처리 작업 수행
        let imageData = try? Data(contentsOf: imageURL)
        let image = imageData.flatMap { UIImage(data: $0) }
        
        // 완료 핸들러 호출
        completion?(image)
    }
}

OperationQueue

Operation을 실행하기 위해서는 OperationQueue를 사용합니다. OperationQueue는 작업을 관리하고 실행하는 객체로, Grand Central Dispatch(GCD)보다 더 높은 수준의 추상화를 제공합니다.

let imageDownloadOperation = ImageDownloadOperation(imageURL: imageURL) { image in
    // 다운로드 완료 후 작업
}

let operationQueue = OperationQueue()
operationQueue.addOperation(imageDownloadOperation)

OperationQueue는 직렬 또는 병렬로 작업을 실행할 수 있으며, 작업의 의존성을 설정하여 실행 순서를 조정할 수도 있습니다.

비동기 작업을 보다 구조화되고 효율적으로 처리하기 위해 Operation과 OperationQueue를 사용하여 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

자세한 내용은 Apple Developer 문서를 참고하세요.