빙수왕의 개발일지

WWDC 2022 - Meet Swift Async Algorithms 본문

개발/iOS

WWDC 2022 - Meet Swift Async Algorithms

빙수킹 2022. 7. 1. 18:07

Meet Swift Async Algorithms

 

AsyncSequence Recap (요약)

  • 비동기적으로 생긴 값을 설명하는 프로토콜
  • Sequence 와 같지만, 2가지 다른점이 있다.

AsyncSequence vs Sequence 2가지 다른점

  • 이놈의 iterator(반복자)로부터 다음에 오는 function은 비동기임 (iteration이 Concurrency사용)
  • iteration은 잠재적 failure로부터 throw 가능 (참고: for-await 사용하여 iterate함.)

사실 AsyncSequenceSequence에서 사용하는 거의 모든거 사용할 수 있다.

ex) map, filter, reduce, …

 

Swift Async Algorithms는 오픈소스 패키지임.

작년에 메세지 앱을 소개했는데 이게 example로 짱이라함.

 

Multi-input algorithms

여러 input을 1개의 output으로 변환.

 

1. Zip

원래 Sequence의 Zip과 똑같은데(tuple형태로 result반환), 매 iterate마다 하나라도 잘못되면 throw 가능.

자기네 메세징 앱에 요런식으로 하는 예시가 있다고 함.

앱에서는 비동기적으로 비디오의 preview를 만들고, (서버에 효율적으로 저장, 전달을 위해) 다양한 사이즈로 비디오를 변환 한다고 함. 이렇게 우리가 서버로 보낼 때, “비디오+preview”를 zip해서 보낼 수 있다.

비디오 / preview 어느쪽이 먼저 생길지는 모른다. 상관없이 어쨌든 먼저가 나중을 기다린다.

결과적으로 쌍으로 이루어진 tuple을 만든다.

 

2. Merge

zip 이랑 비슷하지만, 쌍으로 이루어진 tuple을 만드는 대신,

같은 타입을 share할 수 있는 base가 필요하다. 여러개를 base AsyncSequence로 머지한다.

한쪽이 error을 produce하면 다른 iteration들은 cancel된다.

 

새 Clock API를 사용하여 시간을 관리 - Clock, instant, duration (Swift 5.7)

 

Clock - protocol

  • 2개의 primitive 타입을 정의한다.
  • Built in clock이 있다 - ContinuousClockSuspendingClock
  • ContinuousClock: 스톱와치 같은거 (측정 대상의 상태에 관계없이 시간이 진행되는 곳)
  • SuspendingClock: 잠자도록 유예한다.

 

예시

  • SuspendingClock으로 n초 딜레이

  • 걸린 시간을 측정하는 편리한 method들도 제공한다.

왼쪽은 SuspendingClock, 오른쪽은 ContinuousClock 이다.

 

위 사진에서, 두개의 다른점?

→ 기계가 잠든 상태일 때 행동이 다르다!!!!

맥북을 덮었다 열었을 때. ContinuousClock 만 일했다.

 

SuspendingClock vs ContinuousClock

 

기계가 잠자든 말든 흘러가는 ContinuousClock 은 당연히 실제 시간, human time을 측정하는데 용이하다.

SuspendingClock 은 device의 시간 측정.

 

Algorithms using time - Debounce

 

Clock api는 이벤트에 대한 정확한 제어에 좋다.

예를 들어 메세지를 검색할 때?

우리가 어떤 메세지를 서버에 보내서 검색할 때, 비율 제한(영상에서 rate limit이라고 표현했는데, 너무 많은 검색이 일어나지 않도록 횟수 제한. 말그대로 비율 제한을 말하는 듯 하다)을 걸고 싶다.

암튼 그냥 우리가 아는 그 Debounce 를 설명하려고 하는 것 같은데, 영상에서 너무 어렵게 설명하는것같다.. 어떤 실행을 일으키기 전 어느정도 딜레이를 주고 싶을 때 사용하는 debounce..

아주 빨리 검색창에 입력을 할 때, 매 번 단어가 바뀔 때 마다 request를 할 필요가 없다.

 

debounce 사용 예시

 

0.3초간 입력이 없을 때 performSearch

Debounce는 default로 ContinousClock을 사용한다.

 

Algorithms using time - Chunks (덩어리)

 

서버에 어떤 대량의 message(batches of messages라고 표현함)를 일괄 처리 할 때 사용하면 좋은 예시

chunk values 를 위한 알고리즘들이 있다. (chunk values는 값 덩어리 정도로 생각..? batches of messages랑 비슷한거 아닐까?)

chunk를 count, time, content로 control할 수 있도록 도와준다.

이 작업들을 하다가 error가 생기면 rethrow 된다. 그래서 코드는 실패에 안전하다.

chunked(by:) API를 사용한다. 명시된 시간동안 쌓인다.

1, 2, 3이 순차적으로 온 다음 (일정 시간 후) 한번에 샥. 아래 코드의 경우 0.5초마다 (그룹된..)배치 메세지를 만든다.

 

Collections

 

lazy 알고리즘과 아주 비슷하게 작동한다.

AsyncSequence 로부터 Collection을 만들기 위한 이니셜라이저들을 제공한다.

기존의 데이터타입을 유지할 수 있다.

 

그 외 많은 다른 아이들..

 

아래 사진에 있는 아이들을 대충 나누면 아래와 같다.

  • 결합 - chain, combineLatest, merge
  • 시간으로 비율을 제한 - debounce, throttle
  • chunk로 값들을 끊음 - chunked(by:), chunked(on:), chunks(ofCount:)
  • 버퍼링 범위 - asyncBufferedByIterator
  • reducing - compacted, reductions, removeDuplicates
  • joining - joined
  • 간헐적으로 값을 주입 - interspersed