[swift] PromiseKit를 이용한 센서 데이터 수집 및 처리

이번 글에서는 Swift 언어와 PromiseKit를 사용하여 센서 데이터를 수집하고 처리하는 방법을 알아보겠습니다. PromiseKit는 비동기 처리와 관련된 코드를 간결하고 명확하게 작성할 수 있도록 도와주는 라이브러리입니다.

PromiseKit 소개

PromiseKit는 비동기 코드를 작성할 때 발생할 수 있는 콜백 지옥(callback hell)을 해결하기 위해 만들어진 라이브러리입니다. 콜백 지옥은 비동기 처리 과정에서 콜백 함수를 연속적으로 작성해야 하므로 코드 가독성이 저하되고 유지보수가 어려워지는 현상을 말합니다.

PromiseKit는 프로미스(promise)라는 개념을 도입하여 이런 문제를 해결합니다. 프로미스는 비동기 처리의 결과를 나타내는 객체로, 처리가 완료되면 성공 데이터나 실패 원인에 대한 정보를 가지고 있습니다. 프로미스를 사용하면 비동기 작업을 연속적으로 작성하기보다는 체이닝 형태로 작성할 수 있어 코드를 더욱 간결하게 만들어줍니다.

센서 데이터 수집 예제

먼저, PromiseKit을 프로젝트에 추가해야 합니다. Podfile 파일에 다음의 코드를 추가하고 터미널에서 pod install 명령을 실행하여 설치합니다.

pod 'PromiseKit'

그리고 다음과 같이 SensorDataFetcher라는 클래스를 만들어서 센서 데이터를 수집하는 로직을 구현해보겠습니다.

import PromiseKit

class SensorDataFetcher {
    func fetchData() -> Promise<[Double]> {
        return Promise { seal in
            // 비동기 작업을 수행하는 코드
            let sensor = Sensor() // 센서 객체 생성
            
            sensor.start() // 센서 작동 시작
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                // 1초 뒤에 센서 데이터를 가져오는 비동기 작업 완료
                let data = sensor.getData()
                sensor.stop() // 센서 작동 중지
                
                if data.isEmpty {
                    seal.reject(MyError.noData) // 데이터가 없는 경우 실패 처리
                } else {
                    seal.fulfill(data) // 데이터를 성공적으로 전달
                }
            }
        }
    }
}

enum MyError: Error {
    case noData
}

위 코드에서 SensorDataFetcher 클래스는 fetchData라는 메서드를 통해 센서 데이터를 비동기적으로 수집합니다. Promise 객체를 리턴하며, 내부에서는 Seal 객체를 사용하여 비동기 작업의 결과를 처리합니다.

비동기 작업은 DispatchQueue를 사용하여 1초 후에 실행되도록 하였습니다. 데이터가 없는 경우에는 reject를 호출하여 실패 처리를 하고, 데이터가 있는 경우에는 fulfill을 호출하여 성공 데이터를 전달합니다.

센서 데이터 처리 예제

이제 센서 데이터를 수집하는 코드가 준비되었으니, 이 데이터를 활용하여 처리하는 예제를 살펴보겠습니다.

func processData() {
    let fetcher = SensorDataFetcher()
    
    fetcher.fetchData().done { data in
        // 데이터 수집 성공 시 처리하는 코드
        self.displayData(data)
    }.catch { error in
        // 데이터 수집 실패 시 처리하는 코드
        self.handleError(error)
    }
}

func displayData(_ data: [Double]) {
    // 데이터를 화면에 출력하는 코드
}

func handleError(_ error: Error) {
    // 에러를 처리하는 코드
}

위 코드에서 processData 메서드는 SensorDataFetcher를 사용하여 센서 데이터를 비동기적으로 수집하고, 데이터 수집이 성공한 경우 done 블록에서 처리하며, 실패한 경우 catch 블록에서 처리합니다. 데이터를 처리하는 코드는 displayData 메서드에서 수행하고, 에러 처리는 handleError 메서드에서 수행합니다.

결론

이번 글에서는 Swift 언어와 PromiseKit를 사용하여 센서 데이터를 수집하고 처리하는 방법에 대해 알아보았습니다. PromiseKit의 사용으로 비동기 처리 코드를 보다 간결하고 가독성 있게 작성할 수 있으며, 센서 데이터와 같이 비동기적으로 처리해야 하는 작업에 활용할 수 있습니다.

참고 자료