Calendarr: ein Blick alle zwei Minuten unter die Benachrichtigung

Onyx holt sich nichts, sondern liest den Schnappschuss, den Calendarr in den
gemeinsamen Ordner schreibt — kein Netzzugriff, kein zweiter Zwischenspeicher.
Gemeldet wird das über eine Darwin-Nachricht, und darauf hört Onyx.

Die Nachricht ist aber flüchtig: schreibt Calendarr, während Onyx nicht läuft
oder gerade startet, kommt sie nie an. Der Schnappschuss steht dann so lange
still, bis Calendarr das nächste Mal schreibt — und die Terminliste ist aus
unerfindlichen Gründen von gestern.

Also zusätzlich alle zwei Minuten nachsehen, solange Calendarr überhaupt
gefragt wird. Das kostet das Einlesen einer Datei von vierzehn Kilobyte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-14 13:15:58 +02:00
parent 102c870835
commit c8f3054036

View File

@@ -56,6 +56,8 @@ public final class CalendarModel {
private var refreshTask: Task<Void, Never>? private var refreshTask: Task<Void, Never>?
/// `nil` = nicht auf Calendarr-Änderungen angemeldet. /// `nil` = nicht auf Calendarr-Änderungen angemeldet.
private var calendarrObserver: DarwinObserver? private var calendarrObserver: DarwinObserver?
/// Das Sicherheitsnetz unter der Benachrichtigung.
private var calendarrTimer: Timer?
public init(appleSource: CalendarSource = EventKitSource(), public init(appleSource: CalendarSource = EventKitSource(),
calendarrSource: CalendarSource = CalendarrSource(), calendarrSource: CalendarSource = CalendarrSource(),
@@ -108,6 +110,21 @@ public final class CalendarModel {
Task { @MainActor in self?.refresh() } Task { @MainActor in self?.refresh() }
} }
: nil : nil
// Dazu ein Blick alle zwei Minuten.
//
// Die Benachrichtigung ist der schnelle Weg, aber sie ist flüchtig:
// schreibt Calendarr, während Onyx nicht läuft oder gerade startet,
// kommt sie nie an und dann steht der Schnappschuss so lange still,
// bis Calendarr das nächste Mal schreibt. Das Nachsehen kostet das
// Einlesen einer Datei von wenigen Kilobyte; das ist billiger als eine
// Terminliste, die aus unerfindlichen Gründen von gestern ist.
calendarrTimer?.invalidate()
calendarrTimer = wanted
? Timer.scheduledTimer(withTimeInterval: 120, repeats: true) { _ in
MainActor.assumeIsolated { [weak self] in self?.refresh() }
}
: nil
} }
/// Fragt die Berechtigung an und lädt bei Erfolg gleich. /// Fragt die Berechtigung an und lädt bei Erfolg gleich.