Absturz beim Laden des Hintergrundbilds — und derselbe Fehler in der Ablage
Was in einer View steht, ist an den Hauptthread gebunden: die Konformität zu `View` vererbt das, auch an statische Methoden, die damit nichts zu tun haben. Das Laden lief absichtlich nebenher — und lief damit in die Isolationsprüfung, die das Programm anhält. Der Compiler hat genau das gemeldet: warning: call to main actor-isolated static method 'systemWallpaper()' in a synchronous nonisolated context note: main actor isolation inferred from conformance to protocol 'View' Eine Warnung, keine Fehlermeldung. Ich hatte den Bau nur nach `error:` durchsucht und sie deshalb nicht gesehen. Das Laden liegt jetzt in einem eigenen Typ neben der View, wo es die Bindung nicht gibt. Dieselbe Suche über den ganzen Bau hat einen zweiten Fall gefunden: `FileDropView.stage` wird aus dem Abschlussblock von `loadFileRepresentation` gerufen, also von irgendeinem Thread, gehört aber zu einem `ViewModifier`. Das hätte jeden Dateiabwurf auf die Ablage angehalten. Dazu die Verbesserung, die beim letzten Mal wegen eines falschen Arbeitsverzeichnisses nicht angekommen ist: gesucht wird zuerst unter den Originalen und erst danach in `.thumbnails`. Die kleinen Bilder messen 214 Punkte in der Breite und sind auf einem Retina-Schirm sichtbar unscharf. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -50,7 +50,14 @@ public struct FileDropModifier: ViewModifier {
|
||||
|
||||
/// Rettet die Datei aus dem flüchtigen Verzeichnis in einen eigenen
|
||||
/// Zwischenordner.
|
||||
private static func stage(_ url: URL) -> URL? {
|
||||
///
|
||||
/// `nonisolated`, und das ist keine Formalie: der Block oben läuft auf
|
||||
/// irgendeinem Thread, diese Methode gehört aber zu einem `ViewModifier`
|
||||
/// und ist damit an den Hauptthread gebunden — die Bindung kommt über die
|
||||
/// Konformität, nicht über den Inhalt. Der Compiler mahnt das nur an, zur
|
||||
/// Laufzeit hält die Prüfung das Programm an. Hier ist ohnehin nichts
|
||||
/// dabei, was den Hauptthread bräuchte.
|
||||
nonisolated private static func stage(_ url: URL) -> URL? {
|
||||
let directory = URL(fileURLWithPath: NSTemporaryDirectory())
|
||||
.appendingPathComponent("Onyx-Drop-\(UUID().uuidString)", isDirectory: true)
|
||||
do {
|
||||
|
||||
Reference in New Issue
Block a user