You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
기존에는 클로저를 이용해서 비동기코드를 반복적으로 돌렸다면 이제는 for-await-in문을 이용하여 익숙한 구믄으로 반복할 수 있습니다.
// ✅ 일반 AsyncSequence 예제
for awaitquake in quakes {
if quake.magnitude >3{displaySignificantEarthquake(quake)}}
// ✅ break 사용 예제
for awaitquake in quakes {
if quake.location ==nil{
break
}
if quake.magnitude >3{displaySignificantEarthquake(quake)}}// ✅ continue 사용 예제
for awaitquake in quakes {
if quake.depth >5{
continue
}
if quake.magnitude >3{displaySignificantEarthquake(quake)}}
반복 도중 예외를 던질 수 있습니다. do catch문 안에서 try를 통해 가능합니다.
do{
for tryawaitquake in quakeDownload {...}}catch{...}
그리고 두가지 iteration을 동시에 돌릴 수도 있습니다. 이는 Task를 통해 감쌀 수 있고, 이후 cancel 함수를 호출하여 취소할 수 있습니다.
letiteration1=Task{
for awaitquake in quakes {...}}letiteration2=Task{do{
for tryawaitquake in quakeDownload {...}}catch{...}}//... later on
iteration1.cancel()
iteration2.cancel()
Usage and APIs
macOS Monterey, iOS 15, tvOS 15 및 watchOS 8에서 사용 가능한 여러가지 AsyncSequence API가 존재하지만 그 중 주요 내용 일부만 보여드리겠습니다.
파일에서 각 byte를 읽을 때, 비동기로 읽을 수 있습니다.
for tryawaitline in FileHandle.standardInput.bytes.lines {...}
URL에서 byte나 한 줄씩 데이터를 받아올 때도 비동기로 처리할 수 있습니다.
leturl=URL(fileURLWithPath:"/tmp/somefile.txt")
for tryawaitline in url.lines {...}
URLSession에서 바이트를 읽을 때 비동기로 읽어올 수 있습니다.
URLSession에는 더욱 다양하게 비동기로 읽는 메소드가 새롭게 추가되었기 때문에 Use async/await in URLSession 세션을 확인하면 좋습니다.
let(bytes, response)=tryawaitURLSession.shared.bytes(from: url)
guard let httpResponse = response as?HTTPURLResponse,
httpResponse.statusCode ==200/* OK */else{throwMyNetworkingError.invalidServerResponse
}
for tryawaitbyte in bytes {...}
이외에도 Sequence에서 사용할 수 있는 메소드와 동일한 기능들이 비동기적으로 작동할 수 있게 추가되었습니다.
Adopting AsyncSequence
이제는 iteration을 돌리는 것은 알겠지만 나만의 AsyncSequence를 만들 수 있는 지에 대해 궁금할 수 있습니다. 기존 코드에 적용하는 방법에 초점을 맞추어 설명합니다.
AsyncSequnce와 궁합이 잘 맞는 디자인 패턴이 handler와 delegate입니다.
AsyncStream을 구성할 때 타입과 클로저를 추가해야합니다. 클로저에는 contiinuation과 terminaion을 처리해주어야 합니다. 아래와 같이 구성하게 된다면 다른 사용 부분에서 동일한 로직을 반복해서 사용할 필요가 줄어듭니다.
// ✅ QuakeMonitor 클래스에서 비동기작업을 AsyncSequence로 처리하기 위해 아래 세가지 파라미터 추가classQuakeMonitor{varquakeHandler:(Quake)->Voidfunc startMonitoring()func stopMonitoring()}// ✅ AsyncStream 추가letquakes=AsyncStream(Quake.self){ continuation inletmonitor=QuakeMonitor()
monitor.quakeHandler ={ quake in
continuation.yield(quake)}
continuation.onTermination ={ _ in
monitor.stopMonitoring()}
monitor.startMonitoring()}// ✅ 사용하기letsignificantQuakes= quakes.filter{ quake in
quake.magnitude >3}
for awaitquake in significantQuakes {...}
AsyncStream은 기존 코드를 AsyncSequence가 되도록 조정하는 좋은 방법입니다. AsyncStream`에서 생성되는 유일한 출처는 구성할 때의 클로저이기 때문입니다.
오류를 던질 수 있도록 하려면 AsyncThrowingStream을 사용해서 만들면 됩니다. AsyncStream과 차이점은 오류 처리를 할 수 있다는 점입니다.
Meet AsyncSequence
#3 을 보고 오시면 좋습니다.
What is AsyncSequence?
정의와 특징은 아래와 같습니다.
기존에는 클로저를 이용해서 비동기코드를 반복적으로 돌렸다면 이제는 for-await-in문을 이용하여 익숙한 구믄으로 반복할 수 있습니다.
반복 도중 예외를 던질 수 있습니다. do catch문 안에서 try를 통해 가능합니다.
그리고 두가지 iteration을 동시에 돌릴 수도 있습니다. 이는 Task를 통해 감쌀 수 있고, 이후 cancel 함수를 호출하여 취소할 수 있습니다.
Usage and APIs
macOS Monterey, iOS 15, tvOS 15 및 watchOS 8에서 사용 가능한 여러가지 AsyncSequence API가 존재하지만 그 중 주요 내용 일부만 보여드리겠습니다.
이외에도 Sequence에서 사용할 수 있는 메소드와 동일한 기능들이 비동기적으로 작동할 수 있게 추가되었습니다.
Adopting AsyncSequence
이제는 iteration을 돌리는 것은 알겠지만 나만의 AsyncSequence를 만들 수 있는 지에 대해 궁금할 수 있습니다.
기존 코드에 적용하는 방법에 초점을 맞추어 설명합니다.
AsyncSequnce
와 궁합이 잘 맞는 디자인 패턴이 handler와 delegate입니다.AsyncStream을 구성할 때 타입과 클로저를 추가해야합니다. 클로저에는 contiinuation과 terminaion을 처리해주어야 합니다. 아래와 같이 구성하게 된다면 다른 사용 부분에서 동일한 로직을 반복해서 사용할 필요가 줄어듭니다.
AsyncStream
은 기존 코드를 AsyncSequence가 되도록 조정하는 좋은 방법입니다.
AsyncStream`에서 생성되는 유일한 출처는 구성할 때의 클로저이기 때문입니다.오류를 던질 수 있도록 하려면
AsyncThrowingStream
을 사용해서 만들면 됩니다.AsyncStream
과 차이점은 오류 처리를 할 수 있다는 점입니다.Ref
The text was updated successfully, but these errors were encountered: