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
WWDC에서 AsyncSequence에 대해 설명할때 csv파일을 하나 로드한다고 가정을 하고 설명을 한다. 예를들어서 여러자료가있는 하나의 표를 url을 통해서 데이터를 불러온다고 가정해보면 우리는 항상까지는 아니어도 url을 통한 한번의 api호출을 통해 큰 덩어리의 데이터를 가져오고 그 데이터를 table이나 collection에 띄워주는 방식으로 구현을 해왔다
@mainstructQuakesTool{staticfunc main()asyncthrows{letendpointURL=URL(string:"https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.csv")!
// skip the header line and iterate each one
// to extract the magnitude, time, latitude and longitude
fortryawaiteventin endpointURL.lines.dropFirst(){letvalues= event.split(separator:",")lettime=values[0]letlatitude=values[1]letlongitude=values[2]letmagnitude=values[4]print("Magnitude \(magnitude) on \(time) at \(latitude)\(longitude)")}}}
lines라는 메서드는 URL에 구현되어있는 내부메서드이고 return 타입이 AsyncLineSequence이다. 그렇다는 말은 sequence라는 뜻인데 sequence에대해서 간단하게 공부해보았다
Sequence
Sequence는 protocol인데 그전에 Swift에서는 Collection Type들인 Array, Set, Dictionary는 Collection프로토콜을 conform하고 있는데 이 Collection프로토콜이 Sequence프로토콜을 채택하고 있습니다
Sequence는 한번에 하나씩 진행할 수 있는 list of values인데 가장일반적인 방법으로는 for loop를 쓰는것이다
letoneTwoThree=1...3fornumberin oneTwoThree {print(number)}
// Prints "1"
// Prints "2"
// Prints "3"
What is AsyncSequence
WWDC에서 AsyncSequence에 대해 설명할때 csv파일을 하나 로드한다고 가정을 하고 설명을 한다. 예를들어서 여러자료가있는 하나의 표를 url을 통해서 데이터를 불러온다고 가정해보면 우리는 항상까지는 아니어도 url을 통한 한번의 api호출을 통해 큰 덩어리의 데이터를 가져오고 그 데이터를 table이나 collection에 띄워주는 방식으로 구현을 해왔다
lines라는 메서드는 URL에 구현되어있는 내부메서드이고 return 타입이 AsyncLineSequence이다. 그렇다는 말은 sequence라는 뜻인데 sequence에대해서 간단하게 공부해보았다
Sequence
Sequence는 protocol인데 그전에 Swift에서는 Collection Type들인 Array, Set, Dictionary는 Collection프로토콜을 conform하고 있는데 이 Collection프로토콜이 Sequence프로토콜을 채택하고 있습니다
Sequence는 한번에 하나씩 진행할 수 있는 list of values인데 가장일반적인 방법으로는 for loop를 쓰는것이다
그렇다면 Sequence 프로토콜의 필수구현 메서드는 뭐가있을까 하고 보면
makeIterator이라는 메서드를 필수적으로 구현해야하고 그러기위해서는 Iterator라는 타입이 return되어야해서 IteratorProtocol을 conform하는 타입을 만들어야 합니다. 그래서 Sequence 프로토콜을 채택하는데 성공하게되면 연속적인 데이터가 완성되게되고 for loop에서 사용할 수 있게됩니다
for-in loop
컴파일러가 for loop를 만나게되면, 아래와같은 코드를 어떻게 변환하는지를 간단하게 알아보면 아래처럼 작동합니다
우선 arr를 Iterator로 만들어주고 next가 가능해지게되어서 while로 바꾸게됩니다, next가 nil이되면 while이 끝나고 for문이 종료되는것처럼
그래서 WWDC에서의 예제를 보면 아래와같은 코드를 만났을떄
quakes를 iterator로 만들어주고 해당 return value의 next를 통해 loop를 도는 while문으로 변하게됩니다
그리고 이를
Iterator 패턴
이라고 합니다.그렇다면 makeAsyncIterator를 사용해서 AsyncIterator를 만들게되면 기존에 makeIterator를 사용해서 Iterator를 만들어 사용하는 것과 어떤차이가 있을지를 아래코드로 보면 next를 await하는 방식으로 변하게 된다
그리고 await의 경우엔 Task블럭에서 실행되어야하기 때문에
이와같이 사용해야하고 error를 throw하는 경우엔 do catch문으로 error를 handling해줘야한다
Usage and APIs
그리고 또한 file handler를 통해 byte단위로 data를 호출할 수도 있고
처음에 봤던 예시처럼 line단위로 data를 호출할 수도 있다Using URLSession
아래의 그림처럼 URLSession으로 byte단위로 데이터를 읽어올수있고 이를 for loop에서 sequence단위로 async하게 작동시킬수있다
Conform AsyncSequence
이 섹션에서는 나만의 AsyncSequence를 만드는 방법에 대해 알려줍니다.
응답할 필요가 없고 새로운 값이 발생한다는 것을 알려주는 거의 모든 것이 AsyncSequence를 만드는데 가장 적합한 후보가 될 수 있고 대표적인것이
핸들러 패턴
입니다.QuakeMonitor는 일반적인 핸들러 패턴의 예시이고 핸들러 속성과 시작 및 중지 메서드가 있는 클래스입니다. AsyncSequence를 적용하기에 가장적합한 후보라고합니다.
이것이 기존의 방식인데 아래와같이 바꿀수있습니다
The text was updated successfully, but these errors were encountered: