[swift] Swift PromiseKit과 이미지 다운로드

이번 글에서는 Swift에서 PromiseKit을 사용하여 이미지 다운로드를 처리하는 방법을 알아보겠습니다. PromiseKit은 비동기 작업을 처리하기 위한 간편한 패턴을 제공하여 코드의 가독성과 유지보수성을 높일 수 있습니다.

PromiseKit 소개

PromiseKit은 iOS 및 macOS 앱 개발을 위한 비동기 작업 처리 라이브러리입니다. 기존의 콜백 기반 비동기 코드 대신 Promise 기반 코드를 사용하여 직관적이고 간결한 코드를 작성할 수 있습니다. Promise는 비동기 작업의 결과를 나타내는 객체이며, 성공 또는 실패 상태를 가질 수 있습니다.

PromiseKit을 사용하려면 먼저 프로젝트에 해당 라이브러리를 추가해야 합니다. Podfile 파일을 열고 다음과 같이 PromiseKit을 추가합니다.

pod 'PromiseKit'

그리고 터미널에서 다음 명령을 실행하여 Pod 파일을 설치합니다.

$ pod install

이제 PromiseKit을 사용할 준비가 되었습니다.

이미지 다운로드

이미지 다운로드는 네트워킹 작업의 일반적인 예시입니다. PromiseKit은 네트워킹 작업을 처리하는데 유용한 URLSession 확장을 제공합니다.

이미지를 다운로드하는 함수를 작성해보겠습니다. 다음은 Promise 기반의 이미지 다운로드 함수입니다.

import PromiseKit

func downloadImage(from url: URL) -> Promise<UIImage> {
    return Promise<UIImage> { seal in
        URLSession.shared.dataTask(with: url) { data, response, error in
            if let error = error {
                seal.reject(error)
                return
            }
            
            if let data = data, let image = UIImage(data: data) {
                seal.fulfill(image)
            } else {
                seal.reject(MyError.invalidData)
            }
        }.resume()
    }
}

enum MyError: Error {
    case invalidData
}

이 함수는 주어진 URL에서 이미지를 다운로드하며, 다운로드가 완료되면 해당 이미지를 fulfill 합니다. 데이터가 유효하지 않을 경우에는 MyError.invalidData 에러를 reject합니다.

이제 이 함수를 사용하여 이미지를 다운로드할 수 있습니다. 다음은 이미지를 다운로드하고 해당 이미지가 성공적으로 다운로드되었을 때의 처리 방법입니다.

let imageUrl = URL(string: "https://example.com/image.jpg")!
downloadImage(from: imageUrl).done { image in
    // 이미지 다운로드 성공
    imageView.image = image
}.catch { error in
    // 이미지 다운로드 실패
    print("Error: \(error)")
}

위 코드에서 done 블록은 이미지 다운로드가 성공적으로 완료되었을 때 실행되는 코드입니다. catch 블록은 이미지 다운로드 중에 발생한 에러를 처리하는 코드입니다.

결론

Swift PromiseKit을 사용하면 비동기 작업을 더욱 간결하고 직관적으로 처리할 수 있습니다. 이미지 다운로드를 예시로 들어 설명했지만, PromiseKit은 네트워킹 작업 뿐만 아니라 다른 비동기 작업에도 유용하게 사용할 수 있습니다.

추가로, PromiseKit의 다른 기능들과 사용법에 대해 더 알고 싶다면 PromiseKit의 공식 문서를 참고해보세요.

Happy coding!