Swift Academy · 강의

타임라인 제공자와 스냅샷

시간에 따라 위젯 콘텐츠를 제공합니다.

레슨 2/413개 단계

타임라인 제공자와 스냅샷은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

제공자의 역할

위젯은 계속해서 스스로 업데이트되지 않습니다. 대신 TimelineProvider가 미리 렌더링된 항목의 일정을 WidgetKit에 전달하면 시스템이 각 항목을 알맞은 시점에 표시합니다. 제공자는 세 가지 질문에 답합니다. 플레이스홀더, 스냅샷, 타임라인입니다.

import WidgetKit
// TimelineProvider supplies:
//   placeholder(in:) -> instant skeleton
//   getSnapshot(in:)  -> one entry for previews
//   getTimeline(in:)  -> future entries + refresh policy

TimelineProvider 준수하기

제공자는 연결된 Entry 유형과 함께 TimelineProvider를 준수합니다. 세 메서드를 구현하면 각 메서드가 패밀리와 미리보기 여부를 설명하는 Context를 제공합니다.

import WidgetKit
struct WeatherProvider: TimelineProvider {
    typealias Entry = WeatherEntry
    func placeholder(in context: Context) -> WeatherEntry {
        WeatherEntry(date: Date(),
            temperature: 20, condition: "Sunny")
    }
    // getSnapshot and getTimeline follow
}

플레이스홀더

placeholder(in:)은 대표적인 예시 데이터를 사용해 즉시 반환해야 합니다. 실제 위젯이 로드되는 동안과 위젯 갤러리에서 시스템은 플레이스홀더를 가려진 뼈대 화면으로 표시합니다. 여기서는 네트워크나 디스크 작업을 절대 수행하지 마십시오.

import WidgetKit
func placeholder(in context: Context) -> WeatherEntry {
    // Synchronous, fake data, no I/O
    WeatherEntry(date: Date(),
        temperature: 0, condition: "--")
}

스냅샷

getSnapshot은 위젯 갤러리 미리보기처럼 일시적인 상황에 사용할 항목 하나를 제공합니다. 빠르게 반환해야 합니다. context.isPreview가 true이면 갤러리가 즉시 표시되도록 느린 가져오기 대신 예시 데이터를 사용하십시오.

import WidgetKit
func getSnapshot(
    in context: Context,
    completion: @escaping (WeatherEntry) -> Void) {
    if context.isPreview {
        completion(WeatherEntry(date: Date(),
            temperature: 22, condition: "Clear"))
    } else {
        completion(currentEntry())
    }
}

타임라인

getTimeline이 핵심입니다. 미래의 항목 배열을 만들고 적절한 새로 고침 정책과 함께 Timeline으로 묶습니다. 시스템은 각 항목을 해당 날짜에 렌더링한 다음 정책에 따라 새 타임라인을 요청합니다.

import WidgetKit
func getTimeline(
    in context: Context,
    completion: @escaping (Timeline<WeatherEntry>) -> Void) {
    let entries = buildEntries()
    let timeline = Timeline(
        entries: entries, policy: .atEnd)
    completion(timeline)
}

새로 고침 정책

새로 고침 정책은 WidgetKit이 다음 타임라인을 요청할 시점을 제어합니다. 마지막 항목의 날짜 이후에는 .atEnd, 특정 시점에는 .after(date), 수동으로 새로 고칠 때까지는 .never를 사용합니다. 시스템은 새로 고침 횟수에 예산을 적용하므로 초 단위 업데이트를 기대해서는 안 됩니다.

import WidgetKit
// .atEnd            -> reload after final entry
// .after(someDate)  -> reload at a chosen time
// .never            -> only on manual reloadTimelines
let policy = TimelineReloadPolicy.atEnd
_ = policy

미래 항목 만들기

일반적인 방식은 다음 몇 시간의 항목을 미리 계산하여 매번 코드를 깨우지 않고 위젯이 업데이트되도록 하는 것입니다. 현재 시점부터 미래까지 일정한 간격으로 항목을 생성하고, 각 항목에 해당 시점의 데이터를 담습니다.

import WidgetKit
import Foundation
func hourlyEntries() -> [WeatherEntry] {
    var entries: [WeatherEntry] = []
    let now = Date()
    for hour in 0..<6 {
        let date = Calendar.current.date(
            byAdding: .hour, value: hour, to: now)!
        entries.append(WeatherEntry(date: date,
            temperature: 18 + hour, condition: "Sunny"))
    }
    return entries
}

타임라인의 비동기 데이터

네트워크에서 데이터를 가져와야 한다면 완료 처리기를 호출하기 전에 수행하십시오. 비동기 작업을 Task로 감싸고 데이터가 도착한 후에만 완료하십시오. 제공자에게 허용된 시간이 매우 짧으므로 빠르게 처리해야 합니다.

import WidgetKit
func getTimeline(
    in context: Context,
    completion: @escaping (Timeline<WeatherEntry>) -> Void) {
    Task {
        let entry = await fetchForecast()
        let timeline = Timeline(
            entries: [entry], policy: .after(
                Date().addingTimeInterval(3600)))
        completion(timeline)
    }
}
func fetchForecast() async -> WeatherEntry {
    WeatherEntry(date: Date(),
        temperature: 21, condition: "Cloudy")
}

관련성과 예산

WidgetKit은 배터리를 보호하기 위해 하루 동안 새로 고치는 횟수를 제한합니다. 잦은 업데이트를 강제로 실행할 수는 없습니다. 타임라인마다 여러 항목을 제공하고 합리적인 새로 고침 시점을 선택하십시오. 앱에서는 의미 있는 데이터 변경이 있을 때만 reloadTimelines를 사용하십시오.

import WidgetKit
// The system, not you, decides exact refresh timing.
// Strategy: pre-bake multiple entries + a sensible policy
// + app-driven reloads on real changes.
let budget = "refreshes are budgeted by the OS"
_ = budget

설정 가능한 위젯의 제공자

AppIntentConfiguration 위젯에는 대신 AppIntentTimelineProvider를 사용하십시오. 이 제공자의 메서드는 사용자가 설정한 인텐트를 받으므로 선택한 옵션(선택한 도시나 계정 등)에 맞는 데이터를 가져올 수 있습니다.

import WidgetKit
// AppIntentTimelineProvider adds the configuration:
//   func timeline(for configuration: MyIntent,
//                 in context: Context)
//       async -> Timeline<Entry>
let configurable = "intent-aware provider"
_ = configurable

제공자 완성하기

완성된 제공자는 즉시 반환되는 플레이스홀더, 빠르고 미리보기 여부를 고려하는 스냅샷, 적절한 새로 고침 정책이 적용된 미리 생성된 항목의 타임라인을 제공합니다. 따라서 위젯은 시스템의 예산 안에서 최신 상태를 유지할 수 있습니다.

import WidgetKit
// 1. placeholder -> instant dummy
// 2. getSnapshot -> sample when isPreview, else current
// 3. getTimeline -> [entries] + .atEnd or .after
let summary = "three methods, one current widget"
_ = summary

빠른 확인

플레이스홀더 메서드의 제약 조건을 떠올려 보십시오.

복습

타임라인 제공자를 학습했습니다.

  • placeholder는 즉시 예시 데이터를 반환하고, getSnapshot은 항목 하나를 반환하며(isPreview일 때는 예시 데이터 사용), getTimeline은 미래의 항목과 정책을 반환합니다.
  • 새로 고침 정책은 .atEnd, .after(date), .never이며, 실제 새로 고침에는 OS가 예산을 적용합니다.
  • 여러 항목을 미리 생성하고, 완료 처리 전에 비동기 가져오기를 수행합니다.
  • 설정 가능한 위젯에는 AppIntentTimelineProvider를 사용합니다.
무료로 시작

AI 튜터와 함께 Swift을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
122
레슨
409

자주 묻는 질문

“타임라인 제공자와 스냅샷” 강의는 무료인가요?

네 — “타임라인 제공자와 스냅샷” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“타임라인 제공자와 스냅샷”에서 뭘 배우나요?

시간에 따라 위젯 콘텐츠를 제공합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“타임라인 제공자와 스냅샷” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. WidgetKit 위젯 만들기
  2. 타임라인 제공자와 스냅샷
  3. 앱 확장 기능 개요
  4. 앱 인텐트와 단축어
← Swift Academy(으)로 돌아가기