티스토리 뷰
widget을 만들면 기본으로 만들어지는 코드들을 보면 TimelineProvider, TimelineEntry 가 만들어지고, Configuration생성자에서 provider 라는 파라미터에서 Provider()를 받는 것을 확인할 수 있습니다.
Timeline이 들어간 것들은 다 widget을 언제 업데이트 할지에 관여한다고 보면 될 듯 합니다.
이해하고 써먹는데 애좀 먹은 부분이 timeline 관련한 부분이었습니다.
지금 정리안하면 분명 나중가서 까먹고 다시 공부할게 뻔하기에, 정리하려고 합니다.
1.TimelineProvider

공식문서를 보면 TimelineProvider는 widget이 언제 업데이트 될지 알려주는 프로토콜임을 알 수 있습니다
TimelineProvider를 이해하려면 timeline과 timelineEntry에 대해 먼저 알아야합니다.
timeline&TimelineEntry
공식문서에서는 timeline은 TimelineEntry object의 배열이라고 설명하고 있습니다.
timeline entry는 date에 대한 정보를 가지고 있으며 추가적인 프로퍼티 또한 가질 수 있습니다.
예를 들어보겠습니다.
게임 캐릭터의 healt level을 보여주는 위젯이 있고, 이 healt level이 100 이하로 떨어지면 한시간에 25%씩 회복합니다.
health level이 25% 이하라면 생성되는 timeline은 아래 사진과 같을 것입니다.

한시간에 25%씩 회복되기 때문에 총 4개의 Timeline entry를 가지는 timeline 배열이 생성될 것입니다.

TimelineEntry를 채택하는 CharacterDetailEntry가 있습니다. 여기서 date는 위젯이 업데이트 될 시간정보,
healthLevel은 추가적인 프로퍼티입니다.
그리고 timeline을 다시 그림으로 표현하면 아래와 같습니다.

다시 말해서
timeline은 위젯이 업데이트될 시간과 추가 정보를 가지고 있는 TimelienEntry의 배열 정보라고 할 수 있습니다.
provider는 이 timeline정보를 widget에게 넘겨줌으로써 언제 위젯이 업데이트 해야하는지 알려줍니다.
timeline entries를 요청하는 두가지 방법
WidgetKit은 아래 두가지 방법을 통해서 timeline을 요청할 수 있습니다.
첫번째는 widget의 현재상태를 알려주는 snapshot을 통해서
두번째는 현재날짜와 언제 위젯의 상태가 바뀌어야 하는 대한 미래 날짜 정보를 포함하고 있는 entry배열을 통해서 입니다.
snapshot
snapshot은 유저가 위젯을 추가할 때 같은 일시적으로 위젯을 보여줘야 하는 상황에 불러집니다.
getSaptshot은 context를 파라미터로 가지는데, 위젯 갤러리를 위한 프리뷰를 포함할지 말지, 사이즈는 어떻게 할지 등
entry를 어떻게 사용할지에 대한 세부사항을 포함합니다.
위젯을 추가하는 화면은 유저에게 잠깐 보여집니다.
때문에 시간에 따라 위젯이 업데이트 될 필요 없이 현재 위젯이 보여주어야 할 내용만 알면 되기 때문에 entry배열이 필요하지 않습니다.
현재 시간에 대한 entry 하나만 가지고 있으면 되죠.
entry배열
entry 배열을 요청할 때는 위젯의 내용이 바뀔 필요가 있을 때 사용됩니다.
사용자가 위젯을 추가했고, 위 예제애서 처럼 게임 캐릭터가 healthLevel을 회복하고 있다면, 회복된 healthLevel을 보여주어야 합니다.
즉, 회복되는 시간에 맞춰 widget이 업데이트 되어야 하기 때문에 업데이트 시간정보를 가지고 있는 entry배열이 필요한 것이죠.
2.Determining a Refresh Policy
timeline을 생성할 때 provider는 Widgetkit이 언제 새로운 timeline을 요청할지 정해줄 수 있습니다.
언제 요청할지 규칙을 정해 줄 수 있는데, .atEnd, .after, .never 세가지 policy가 있습니다.
.atEnd
마지막 date가 지난 후 새로운 timeline을 요청합니다.
.after
.never
**참고
'ios' 카테고리의 다른 글
| [ios]View Controller 생명주기(작성중) (0) | 2022.01.17 |
|---|---|
| [ios]앱스토어 배포 과정 및 후기 (2) | 2021.12.27 |
| [WidgetKit]Widget이란? & Widget 만들기 (0) | 2021.12.22 |
| [ios]앱스토어 등록 전 알아두면 좋을 것들 (0) | 2021.12.18 |
| [error] unable to dequeue a cell with identifier (0) | 2021.08.09 |
- Total
- Today
- Yesterday
- 백준 1065번 swift
- 파이썬
- Xcode
- xcsharedata
- 백준 4673 swift
- 백준알고리즘
- main branch
- property wrapper
- Widget
- New Group
- New Group Without Folder
- closure
- palera1n
- provisioning key
- 애플 인증
- sileo
- 백준
- 알고리즘
- ios mvvm
- readme ignore파일 포함한 repository
- SWiFT
- xcuserdata
- 애플 인증서
- ios
- 프로퍼티 래퍼
- mvvm in swiftui
- 이분탐색
- 클로저
- django
- 장고
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 29 |
| 30 |
