본문 바로가기
Programming Paradigm/Functional Programming

비동기 반환 (Async Result)

by 탄이. 2020. 3. 5.

연산이 오래 걸리거나, 네트워크를 통해서 결과를 얻거나, 딜레이가 포함되어 있는 내용은 비동기(async) 방식으로 결과는 나중에 생길 때 전달받기로 하고 프로그램의 수행을 멈추지 않는 방식으로 함수를 구현하는 것이 좋습니다.

// 동기
func syncFunc(_ nums: [Int]) -> Int {
    sleep(1)
    let sum = nums.reduce(0, +)
    return sum
}

// 비동기
func asyncFunc(_ nums: [Int], _ result: @escaping (Int) -> Void) {
    print("sleep......3")
    DispatchQueue.main.async {
        sleep(3)
        let sum = nums.reduce(0, +)
        result(sum) // 결과가 리턴값으로 전달되는 것이 아니라, 전달받은 함수(result)를 호출함으로써 전달됩니다.
    }
}

let asf: (Int) -> () = { print($0) }
asyncFunc([1, 7, 2, 5, 14], asf)
print("프로그램의 수행을 멈추지 않음")

// "sleep.....3"
// "프로그램의 수행을 멈추지 않음"
// ...
// 29

댓글