Closed NEULiee closed 2 years ago
(마지막 부분이라 마무리 느낌일 줄 알았는데 하이라이트였다..)
Fetch Reminders Asynchronously
LocalizedError
EKEventStore
async, await, continuation
Convert Between Model Types
Create a Reminder Store
static let shared = ReminderStore()
-> singleton patternvar isAvailabel: Bool {
EKEventStore.authorizationStatus(for: .reminder) == .authorized
}
Read All Reminders
// reminder 항목으로만 좁힐 수 있다.
let predicate = ekStore.predicateForReminders(in: nil)
let ekReminders = try await ekStore.fetchReminders(matching: predicate)
// [EKReminder] -> [Reminder]
let reminders: [Reminder] = try ekReminders.compactMap { ekReminder in
do {
return try Reminder(with: ekReminder)
} catch TodayError.reminderHasNoDueDate {
// nil을 반환하면 대상 컬렉션에서 이 reminder를 삭제
return nil
}
}
Request Access to Reminder Data
let status = EKEventStore.authorizationStatus(for: .reminder)
try await ekStore.requestAccess(to: .reminder)
@unknown default
Display Errors to the User
func showError(_ error: Error) {
let alertTitle = NSLocalizedString("Error", comment: "Error alert title")
let alert = UIAlertController(title: alertTitle, message: error.localizedDescription, preferredStyle: .alert)
let actionTitle = NSLocalizedString("OK", comment: "Alert OK button title")
alert.addAction(UIAlertAction(title: actionTitle, style: .default, handler: { [weak self] _ in
self?.dismiss(animated: true)
}))
present(alert, animated: true, completion: nil)
}
Display Reminders
reminder store 적용하여 snapshot 을 업데이트 한다.
비동기적으로 실행되는 새로운 작업 단위 : Task
func prepareReminderStore() {
Task {
do {
try await reminderStore.requestAccess()
reminders = try await reminderStore.readAll()
} catch TodayError.accessDenied, TodayError.accessRestricted {
#if DEBUG
reminders = Reminder.sampleData
#endif
}
}
}
오류가 발생하면 디버그 모드에서 샘플데이터를 할당한다. 이 플래그는 realse 용 앱을 빌드할 때 코드가 컴파일되지 않도록 하는 컴파일 지시문이다. 디버그 빌드에서 코드를 테스트하거나 샘플 테스트 데이터 제공을 위해 이 플래그를 사용할 수 있다.
Info.plist 말고 [프로젝트 - Info]
Test EventKit Integration
Q. Which class provides access to the user's calendar and reminders data? A. EKEventStroe The EKEventStore class is an app's point of contact for accessing calendar and reminder data
Q. What is the event store's authorization status for reminders for if the user taps "Don't Allow" when the app asks for access to Reminders? A. denied denied indicates that the user explicitly denied app access to reminders data.
Q. What is the type of fetched
in this code sample?
let eventStore = EKEventStore()
func loadReminders() {
let predicate = eventStore.predicateForReminders(in: nil)
eventStore.fetchReminders(matching: predicate) { (fetched) in
}
}
A. [EKReminder]? fetchReminders(matching:completion:) fetches reminders that match a given predicate. It passes an optional array of EKReminder to its completion handler.
Today 앱을 닫으면 사용자가 변경한 내용이 사라지고, 사용자가 앱 외부에서 변경한 내용이 자동으로 반영되지 않는다.
Respond to Change Notifications
eventStorChanged()
함수를 호출한다.
NotificationCenter.default.addObserver(self, selector: #selector(eventStoreChanged(_:)), name: .EKEventStoreChanged, object: nil)
Read Reminders Individually
Convert Between Model Types
Save Reminders Individually
Save Added Reminders
Save Updated Reminders
Remove Reminders
Loading Reminders