본문 바로가기

iOS/학습정리

SwiftUI) Widget - (3) Timeline

이번 글은 iOS 14부터 추가된 Widget과 관련된 시리즈 글 중 세 번째 글입니다.
SwiftUI) Widget - (1) Meet Widget
SwiftUI) Widget - (2) How Widget Works
같은 시리즈의 다른 글도 읽어보시길 추천드립니다. 글에 오류가 있거나 궁금한 점이 있으시면 언제든 댓글 남겨주세요. 감사합니다:)

Timeline

WidgetKit이 위젯 뷰를 업데이트하도록 date를 구체화하는 객체

struct Timeline<EntryType> where EntryType : TimelineEntry

위젯 뷰를 언제 업데이트할지 WidgetKit에 알리기 위해 TimelineProvider가 타임라인을 생성합니다. 타임라인은 TimelineEntry 객체 배열과 업데이트 정책을 가지고 있습니다.

TimelineEntry

TimelineEntry를 생성하려면, TimelineEntry를 따르는 커스텀 타입을 선언해야 합니다. 각각의 엔트리는 WidgetKit이 위젯 뷰를 갱신할 date와 위젯이 뷰를 렌더링하는데 필요한 추가적인 정보를 구체화하도록 합니다.

TimelineEntry는 또한 동일한 위젯 내에서 타임라인에 있는 다른 엔트리와 비교하는 relevance에 대한 정보를 가집니다. relevance는 WidgetKit이 스택에 있는 위젯 중 어느 위젯을 위에 표시해야 할 지 고려하는데 사용되지만 하나의 위젯 내에서도 어떤 정보를 표시할 지 판단하는데에도 사용됩니다.

예를 들어, 지불해야하는 카드값을 알려주는 앱이라면, 순서대로 바로 다음 카드 값을 알려주기 보다 가까운 미래에 지불해야 하는 금액 중 가장 큰 금액이 우선순위를 가질 수 있습니다.

Timeline Refresh Policy

타임라인의 갱신 정책은 WidgetKit이 언제 Provider에게 새로운 타임라인을 요청할지에 대한 date를 구체화합니다. 해당 date에 명시되어 있는 그 시점에 갱신되지 않고 그 이후에 갱신될 수 있습니다.

.atEnd - Default
디폴트 갱신 정책인 .atEnd는 가장 최신에 넘겨 받은 타임라인 엔트리 배열의 마지막 date 이후에 새로운 타임라인을 요청하는 것입니다. 즉, 더이상의 타임라인 엔트리가 없을 때 갱신하는 것입니다.

.afterDate
디폴트 date의 이전이나 이후의 다른 date로 지정할 수 있습니다. 타임라인을 갱신하기로 정해진 시점보다 더 전에 변경해야할 지점이 있다면 지정하는 것이 좋습니다. 반대로 타임라인이 특정 기간동안 변경되지 않아야 한다면 디폴트 date보다 더 늦은 date로 지정할 수 있습니다.

예를 들어, 드래곤이 2.5 시간마다 나타나서 개임 케릭터와 싸웁니다. 이 전투의 결과가 캐릭터의 건강 레벨을 변화시키기 때무에 , provider는 배틀 이후에 새로운 타임라인을 요청할 수 있습니다.

// Request a timeline refresh after 2.5 hours.
let date = Calendar.current.date(byAdding: .minute, value: 150, to: Date())
let timeline = Timeline(entries: entries, policy: .after(date))
completion(timeline)

.never
새로운 타임라인을 요청하지 않는다는 것입니다. 이러한 경우엔, WidgetKit이 새로운 타임라인을 요청하기 위해 WidgetCenter의 reloadTimelines(ofKind:)를 사용합니다.

참고

'iOS > 학습정리' 카테고리의 다른 글

SwiftUI) Widget - (4) TimelineProvider  (1) 2021.02.28
iOS) Intents  (0) 2021.02.28
SwiftUI) Widget - (2) How Widget Works  (2) 2021.02.28
SwiftUI) Widget - (1) Meet Widget  (0) 2021.02.28
iOS) UIResponder와 Responder Chain  (0) 2021.02.10