티스토리 뷰
[Swift 5.9] Convenience Async[Throwing]Stream.makeStream methods
doyeonjeong_ 2024. 3. 7. 16:57원문: 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의 이러한 새로운 기능은 비동기 스트림 작업을 보다 효율적으로 관리할 수 있게 해준다!
'Apple > Swift' 카테고리의 다른 글
[Swift 5.9] Consume operator to en the lifetime of a variable binding (4) | 2024.03.06 |
---|---|
[Swift 5.9] Noncopyable structs and enums (0) | 2024.01.11 |
[Swift 5.9] Macro (0) | 2024.01.11 |
[Swift 5.9] Value and Type Parameter Packs (0) | 2024.01.09 |
[Swift 5.9] if and switch expressions (1) | 2024.01.08 |
- Total
- Today
- Yesterday
- AsyncSwift Korea Seminar
- listview
- it seminar
- 꼼꼼한 재은 씨의 스위프트 문법편
- 오블완
- Swift Conference
- jsonkey
- jsonserializable
- sliverlist
- fromjson()
- flutter
- tojson()
- 낙관적 업데이트 패턴
- CellStyle
- ios
- LLM
- 싱글톤
- slivers
- llm 설치
- swift5.9
- 의존성
- sliver
- 티스토리챌린지
- 이코테
- UITableViewCell
- 오블완챌린지
- SWIFT
- 핵심내용
- 플러터
- llama
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |