[swift] Swift PromiseKit과 데이터 캐싱

많은 앱에서는 네트워크를 통해 데이터를 가져오는 동안 사용자에게 로딩 인디케이터를 표시하기 위해 Promise 라이브러리를 사용합니다. Swift에서 많이 사용되는 Promise 라이브러리 중 하나는 PromiseKit입니다.

PromiseKit은 비동기 작업을 처리하고 결과를 다루기 위한 간편한 인터페이스를 제공합니다. 이를 통해 코드를 함께 연결하고 각 작업이 완료될 때 어떤 작업을 수행해야 하는지 정의할 수 있습니다.

데이터 캐싱은 애플리케이션의 성능과 사용자 경험을 향상시키기 위해 매우 중요합니다. 네트워크로부터 데이터를 가져오는 과정은 시간이 많이 소요되는 작업일 수 있으므로 매번 데이터를 가져오는 것은 효율적이지 않습니다. 데이터 캐싱을 사용하면 이전에 가져온 데이터를 로컬에 저장하고 필요할 때마다 사용할 수 있습니다.

이제 PromiseKit와 데이터 캐싱을 함께 사용하는 방법을 살펴보겠습니다. 여기에는 예제 프로젝트의 코드가 포함되어 있습니다.

프로미스를 이용한 데이터 가져오기

먼저, 데이터를 가져오는 비동기 작업을 Promise를 사용하여 처리하는 예제 코드를 살펴보겠습니다. 아래는 PromiseKit을 사용하여 데이터를 가져오는 함수의 예입니다.

import PromiseKit
import Alamofire

func getDataFromServer() -> Promise<[String]> {
    return Promise<[String]> { seal in
        AF.request("https://example.com/data").responseJSON { response in
            switch response.result {
            case .success(let data):
                if let dataArray = data as? [String] {
                    seal.fulfill(dataArray)
                } else {
                    seal.reject(MyError.invalidData)
                }
            case .failure(let error):
                seal.reject(error)
            }
        }
    }
}

위의 코드에서는 Alamofire를 사용하여 서버로부터 데이터를 비동기적으로 가져오는 함수입니다. 이 함수는 Promise<[String]>을 반환합니다. 데이터를 가져오는 데 성공하면 seal.fulfill(dataArray)를 호출하여 데이터를 성공적으로 가져온다고 알립니다. 실패한 경우 seal.reject(error)를 호출하여 실패 상태를 알립니다.

데이터 캐싱

이제 데이터를 가져온 후에 데이터를 캐싱하는 방법에 대해 알아보겠습니다. 이전에 가져온 데이터를 저장하고 필요할 때마다 사용하기 위해 캐시 클래스를 작성할 것입니다. 아래는 캐시 클래스의 예입니다.

import Foundation

class DataCache {
    static let shared = DataCache()
    
    private var cachedData: [String] = []
    
    func getData() -> [String]? {
        return cachedData
    }
    
    func cacheData(_ data: [String]) {
        cachedData = data
    }
}

위의 코드에서는 싱글턴으로 구현된 DataCache 클래스를 정의합니다. cachedData는 캐싱된 데이터를 저장하는 배열입니다. getData() 함수는 캐시된 데이터를 반환하고 cacheData(_:) 함수는 데이터를 캐싱합니다.

프로미스와 데이터 캐싱을 함께 사용하기

이제 Promise와 데이터 캐싱을 함께 사용하여 데이터를 가져오는 작업을 완료해 보겠습니다. 아래는 데이터를 가져오고 캐싱하는 작업을 처리하는 예제 코드입니다.

func fetchData() -> Promise<[String]> {
    if let cachedData = DataCache.shared.getData() {
        return Promise.value(cachedData)
    } else {
        return getDataFromServer().tap { data in
            DataCache.shared.cacheData(data)
        }
    }
}

위의 코드에서는 fetchData() 함수에서 먼저 캐시된 데이터가 있는지 확인합니다. 캐시된 데이터가 있으면 Promise.value(cachedData)를 사용하여 이미 캐시된 데이터를 반환합니다. 캐시된 데이터가 없는 경우 getDataFromServer()를 호출하여 서버로부터 데이터를 가져오고, 가져온 데이터를 캐시에 저장한 다음 tap에 의해 반환됩니다.

결론

Swift PromiseKit과 데이터 캐싱을 함께 사용하면 네트워크를 통해 데이터를 가져오는 작업의 성능을 향상시킬 수 있습니다. Promise를 사용하여 비동기 작업을 처리하고 캐싱을 사용하여 이전에 가져온 데이터를 재사용할 수 있습니다.

더 쉬운 프로그래밍과 더 나은 앱 성능을 위해 Swift PromiseKit과 데이터 캐싱을 활용해보세요!

참고 자료