티스토리 뷰

원문: https://www.hackingwithswift.com/swift/5.9/convenience-asyncthrowingstream-makestream

Swift 5.9의 새로운 기능: AsyncStream과 AsyncThrowingStream의 makeStream 메소드

Swift 5.9에서는 SE-0388이라는 제안을 도입하여, AsyncStream과 AsyncThrowingStream에 makeStream() 메소드를 추가했다. 이 메소드는 스트림과 그 연속성을 동시에 반환하는 기능을 가지고 있다.

 

여기서 단어의 의미를 한번 짚고 넘어가자면,

'스트림'이란 데이터를 순차적으로 처리하는 흐름 같은 걸 의미한다.

그리고 이 데이터들이 어떻게 생성되고 끝나는지를 관리하는 걸 '연속성'이라고 부른다.

 

예전에는 스트림을 만들고, 이 '연속성'을 따로따로 관리해야 했기 때문에 코드가 복잡해지고 관리하기 힘들었다.
그런데 Swift 5.9에서 새로 나온 `makeStream()` 메소드를 사용하면, 스트림과 그 '연속성'을 동시에 받아볼 수 있다.

즉, 스트림을 만들면서 그 스트림에 데이터를 추가하거나 끝내는 연속성을 한 번에 다룰 수 있게 되어

코드도 간단해지고 관리도 쉬워지도록 업데이트 된 것! 그 코드가 뭐였는지 살펴보자.

기존 방식

기존에는 아래처럼 코드를 썼었다.

var _continuation: AsyncStream<String>.Continuation!
let stream = AsyncStream<String> { continuation = $0 }
let continuation = _continuation!

이렇게 작성하면, 스트림을 생성하고 따로 연속성을 관리해야 했다.

새로운 방식

하지만 이제는 스트림과 연속성을 동시에 얻을 수 있다.

let (stream, continuation) = AsyncStream.makeStream(of: String.self)

이는 현재 컨텍스트 외부에서 연속성에 액세스해야 하는 경우에 특히 유용하다.

예시

간단한 숫자 생성기를 예로 들어보자.

이 생성기는 queueWork() 메소드에서 연속성을 호출할 수 있도록 연속성을 자체 속성으로 저장해야 했다.

struct OldNumberGenerator {
    private var continuation: AsyncStream<Int>.Continuation! // 연속성을 선언
    var stream: AsyncStream<Int>! // 스트림도 선언

    init() {
        stream = AsyncStream(Int.self) { continuation in
            self.continuation = continuation // 스트림을 만들면서 연속성을 설정
        }
    }

    func queueWork() {
        Task {
            for i in 1...10 {
                try await Task.sleep(for: .seconds(1))
                continuation.yield(i) // 연속성을 통해서 스트림에 데이터를 추가
            }

            continuation.finish() // 끝났다고 알려주기
        }
    }
}

하지만 새로운 makeStream(of:) 메소드를 사용하면 훨씬 간단해진다.

struct NewNumberGenerator {
    let (stream, continuation) = AsyncStream.makeStream(of: Int.self) // 스트림과 연속성을 한 번에 선언하고 설정

    func queueWork() {
        Task {
            for i in 1...10 {
                try await Task.sleep(for: .seconds(1))
                continuation.yield(i) // 연속성을 통해서 스트림에 데이터를 추가
            }

            continuation.finish() // 끝났다고 알려주기
        }
    }
}

이렇게 하면 코드가 더욱 간결해지고 가독성이 향상된다.

Swift 5.9의 이러한 새로운 기능은 비동기 스트림 작업을 보다 효율적으로 관리할 수 있게 해준다!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함