CoreBluetooth lief auf dem Hauptthread, also demselben, der die
Oberfläche zeichnet. Gescannt wird mit Duplikaten über alle Geräte in
Reichweite, weil Victron seine Werte im Advertisement mitschickt - jedes
einzelne davon kam als Rückruf dort an, samt Entschlüsselung und
Neuzeichnung. Das war die Ursache der trägen Bedienung.
CoreBluetooth arbeitet jetzt auf einer eigenen seriellen Queue. Daraus
folgt eine strikte Trennung:
* Verbindungen, Puffer und Zeitgeber werden ausschliesslich auf dieser
Queue angefasst. Die Zeitgeber sind deshalb DispatchSourceTimer statt
Timer, denn auf einer DispatchQueue gibt es keine RunLoop.
* Die veröffentlichten Werte werden ausschliesslich auf dem Hauptthread
geschrieben, gebündelt über publish().
* Die Geräteliste wird nicht mehr aus der Funk-Queue heraus im Speicher
nachgeschlagen. Stattdessen zieht refreshConfiguration auf dem
Hauptthread eine Momentaufnahme - Kennung, Transportart, Zonenwahl und
den bereits ausgelesenen Victron-Schlüssel - und reicht sie hinüber.
Damit greift kein Hintergrundthread mehr auf den beobachteten Speicher
zu.
Die Stellbefehle der Kühlbox bauen ihren Einstellungsblock ebenfalls auf
der Funk-Queue, weil der zugrundeliegende Zustand dort lebt.
Geprüft im Simulator: der Statuswechsel von CoreBluetooth kommt über die
Funk-Queue und erreicht die Anzeige korrekt, beide Startpfade laufen ohne
Absturz.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>