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:
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user