NSFilePresenter: Was es ist, NSFileCoordinator-Protokoll und Verfolgungsmethoden

Autor: IT Sectr Veröffentlicht: 2026-07-12 Lesezeit: 7 Min.

NSFilePresenter ist ein Foundation-Protokoll, das es einem Objekt ermöglicht, Benachrichtigungen über Änderungen an Dateien und Verzeichnissen im iOS- und macOS-Dateisystem zu erhalten. Die Klasse implementiert die Protokollmethoden und registriert sich über NSFileCoordinator, woraufhin das System diese Methoden automatisch bei allen Operationen mit der verfolgten Datei aufruft. Laut Apple Developer Documentation (2025) wird NSFilePresenter in Anwendungen mit Multithread-Dokumentenzugriff verwendet, um Schreibkonflikte zu verhindern. Das Protokoll muss in Verbindung mit NSFileCoordinator verwendet werden — nur so wird eine sichere Zugriffskoordination gewährleistet.

Wichtige Punkte

  • NSFilePresenter — ein Foundation-Protokoll zur Verfolgung von Datei- und Verzeichnisänderungen in iOS und macOS.
  • NSFileCoordinator — eine obligatorische Begleitklasse, die den Zugriff verwaltet und Delegatenmethoden aufruft.
  • accommodatePresentedItemDeletion — eine Methode zur Behandlung des Löschens der verfolgten Datei mit Abbruchmöglichkeit.
  • presentedItemDidChange — wird aufgerufen, wenn sich der Inhalt einer Datei oder eines Verzeichnisses ändert.
  • presentedItemURL — eine obligatorische Eigenschaft, die die URL der verfolgten Datei zurückgibt.

Was ist NSFilePresenter?

NSFilePresenter ist ein Foundation-Protokoll, das zur Verfolgung von Datei- und Verzeichnisänderungen in Apple-Betriebssystemen entwickelt wurde. Das Protokoll definiert eine Reihe von Methoden, die das Beobachterobjekt implementiert, um Benachrichtigungen über Dateisystemereignisse zu erhalten.

Der Hauptzweck des Protokolls besteht darin, sicheren Dateizugriff in Multithread-Szenarien zu ermöglichen. In iOS und macOS können mehrere Prozesse und Threads gleichzeitig über NSFileCoordinator auf dieselbe Datei zugreifen, und NSFilePresenter stellt sicher, dass jeder Teilnehmer den aktuellsten Datenstatus erhält.

Das Protokoll ist seit iOS 5.0 und macOS 10.7 in Foundation enthalten. Es wird in Anwendungen verwendet, die mit Dokumenten, Datenbanken und beliebigen Dateien arbeiten, die gleichzeitig von verschiedenen Quellen geändert werden können — zum Beispiel bei der iCloud-Synchronisation oder der gemeinsamen Bearbeitung.

Wo NSFilePresenter verwendet wird

Dokumentenbasierte Anwendungen — der Hauptanwendungsbereich von NSFilePresenter. Anwendungen, die mit UIDocument oder NSDocument arbeiten, registrieren sich automatisch als Präsentatoren über NSFileCoordinator. Dies ermöglicht die korrekte Behandlung von Konflikten beim Bearbeiten derselben Datei aus mehreren Fenstern oder Geräten.

iCloud-Synchronisation — das zweite Schlüsselszenario. Wenn eine Datei auf einem Gerät geändert wird, synchronisiert iCloud sie auf allen verbundenen Geräten. NSFilePresenter benachrichtigt die Anwendung über diese Änderungen und ermöglicht so rechtzeitige Oberflächenaktualisierungen.

Multithread-Editoren — das dritte Szenario. In Anwendungen, bei denen Hintergrundwarteschlangen Daten gleichzeitig mit der Benutzerarbeit laden und speichern, verhindert NSFilePresenter Wettlaufsituationen beim Schreiben und Lesen von Dateien.

Wie funktioniert NSFilePresenter?

Der Arbeitsmechanismus von NSFilePresenter basiert auf dem Delegationsmodell: Das Objekt implementiert die Protokollmethoden, registriert sich über NSFileCoordinator und erhält Aufrufe, wenn sich die verfolgte Datei ändert. Das System selbst bestimmt, wann eine Änderung auftritt und welche Methoden aufgerufen werden sollen.

Der Prozess beginnt, wenn das Objekt eine Instanz von NSFileCoordinator erstellt und die Methode des Koordinators aufruft, wobei es die Datei-URL übergibt. Der Koordinator prüft, ob für diese URL Präsentatoren registriert sind. Wenn ja, blockiert er den Lese- oder Schreibzugriff und benachrichtigt die Präsentatoren über die bevorstehende Änderung über die Protokollmethoden.

Nach Abschluss des Vorgangs gibt der Koordinator die Sperre frei und ruft die abschließenden Benachrichtigungen auf. Wichtig ist, dass der Präsentator den Ausführungsfluss nicht steuert — er reagiert nur auf Ereignisse. NSFileCoordinator ist vollständig für die Koordination verantwortlich.

Lebenszyklus einer Benachrichtigung

Vorbereitungsphase — vor der Ausführung eines Vorgangs ruft der Koordinator accommodatePresentedItemDeletion oder accommodatePresentedSubitemDeletion auf. Der Präsentator kann die Situation behandeln oder den Vorgang durch Rückgabe eines Fehlers abbrechen. Diese Phase ermöglicht der Anwendung, die Arbeit mit der Datei ordnungsgemäß abzuschließen, bevor sie geändert wird.

Benachrichtigungsphase — nach Abschluss des Vorgangs ruft der Koordinator presentedItemDidChange oder presentedSubitemDidChange auf. Der Präsentator erhält ein Signal, dass sich die Datei geändert hat, und kann ihren Inhalt erneut lesen. Für Dateiverschiebungen wird presentedItemDidMoveToURL mit dem neuen Speicherort aufgerufen.

Abschlussphase — der Koordinator gibt alle Sperren frei und gibt Ressourcen frei. Der Präsentator kann mit den aktualisierten Daten weiterarbeiten. Alle drei Phasen werden synchron in einem einzigen Thread ausgeführt, daher müssen die Protokollmethoden schnell ohne langwierige E/A-Operationen ausgeführt werden.

Wichtigste Methoden des Protokolls

Das NSFilePresenter-Protokoll enthält mehrere erforderliche und optionale Methoden. Die einzige erforderliche Eigenschaft ist presentedItemURL, die die URL der verfolgten Datei oder des Verzeichnisses zurückgibt. Ohne diese Eigenschaft kann das Objekt nicht als Präsentator registriert werden.

Erforderliche Methoden

presentedItemURL — eine Eigenschaft vom Typ URL?, die den Pfad zur verfolgten Datei zurückgeben muss. Wenn das Objekt mehrere Dateien verfolgt, gibt die Eigenschaft die URL des Hauptelements zurück. Bei Verzeichnissen wird die URL des Verzeichnisses zurückgegeben.

presentedItemDidChange — wird aufgerufen, nachdem sich der Inhalt der verfolgten Datei geändert hat. In dieser Methode aktualisiert der Präsentator seinen internen Zustand und lädt Daten neu. Diese Methode erhält keine Informationen darüber, was sich genau geändert hat — nur die Tatsache der Änderung.

Optionale Methoden

accommodatePresentedItemDeletion — wird vor dem Löschen der Datei aufgerufen. Der Präsentator kann den aktuellen Zustand speichern, Dateideskriptoren schließen oder den Vorgang durch Rückgabe eines NSError abbrechen. Wenn die Methode einen Fehler zurückgibt, wird der Löschvorgang nicht ausgeführt.

presentedItemDidMoveToURL — wird nach dem Verschieben oder Umbenennen der Datei aufgerufen. Die Methode erhält die neue URL, und der Präsentator muss die Dateireferenz aktualisieren. Ohne Implementierung dieser Methode zeigt der Präsentator weiterhin auf den alten, nicht vorhandenen Pfad.

NSFilePresenter und NSFileCoordinator

NSFileCoordinator und NSFilePresenter sind ein untrennbares Paar. NSFileCoordinator verwaltet den Dateizugriff und ruft die Präsentatormethoden auf. Der Präsentator arbeitet nicht direkt mit dem Dateisystem — alle Operationen laufen über den Koordinator, der die Atomizität der Änderungen garantiert.

Der Koordinator registriert den Präsentator über die addFilePresenter-Methode der NSFileCoordinator-Klasse. Nach der Registrierung beginnt der Präsentator, Benachrichtigungen zu erhalten. Die Entfernung erfolgt über removeFilePresenter. Das System hält eine schwache Referenz auf den Präsentator, daher muss das Objekt während des gesamten Verfolgungszeitraums am Leben bleiben.

Laut Apple WWDC 2022 verwendet NSFileCoordinator einen Koordinationsmechanismus auf Kernel-Ebene, der minimale Latenz bei Sperren gewährleistet. In den neuesten iOS-Versionen ist der Koordinator für die Arbeit mit Sandbox und App-Erweiterungen optimiert.

Koordinationsregeln

Intention — jeder Lese- oder Schreibvorgang muss in einen Koordinationsblock eingeschlossen werden: Lesen über coordinateReadingItemAtURL, Schreiben über coordinateWritingItemAtURL. Der Koordinator sperrt die Datei während der Blockausführung automatisch für andere Teilnehmer.

Stapelkoordination — für Operationen mit mehreren Dateien wird die Stapelkoordination verwendet. Der Koordinator sperrt atomar alle angegebenen Dateien, führt die Operation aus und gibt die Sperren frei. Dies ist beim Verschieben oder Kopieren von Dokumentsätzen von entscheidender Bedeutung.

Implementierungsbeispiel

Erstellen wir eine Klasse DocumentPresenter, die das NSFilePresenter-Protokoll implementiert und Änderungen an einer Dokumentendatei verfolgt. Die Klasse enthält einen Verweis auf die Datei, interne Daten und ein Gültigkeitsflag.

swift
import Foundation

class DocumentPresenter: NSObject, NSFilePresenter {
    var presentedItemURL: URL? {
        return self.fileURL
    }

    var presentedItemOperationQueue: OperationQueue {
        return self.queue
    }

    private let fileURL: URL
    private let queue = OperationQueue()

    func presentedItemDidChange() {
        self.reloadData()
    }

    func accommodatePresentedItemDeletion() throws {
        try self.saveCurrentState()
    }

    private func reloadData() {
        let coordinator = NSFileCoordinator(filePresenter: self)
        var error: NSError?
        coordinator.coordinate(readingItemAt: self.fileURL,
                               options: [],
                               error: &error)
        { readURL in
            guard let data = try? Data(contentsOf: readURL)
            else { return }
            self.processData(data)
        }
    }

    private func processData(_: Data) {
        // Dokumentendatenverarbeitung
    }
}

Die Klasse implementiert presentedItemDidChange zum Neuladen von Daten bei Dateiänderungen und accommodatePresentedItemDeletion zum Speichern des Zustands vor dem Löschen. Die Operationswarteschlange stellt sicher, dass alle Benachrichtigungen sequentiell verarbeitet werden.

Die Registrierung des Präsentators erfolgt über NSFileCoordinator.addFilePresenter beim Öffnen eines Dokuments. Es ist wichtig, dem Koordinator die korrekten Leseoptionen zu übergeben — withoutChanges für nicht-ändernde Operationen oder immediatelyAvailable für Szenarien mit sofortigem Zugriff.

Häufige Fehler

Der erste häufige Fehler ist die fehlende Implementierung von presentedItemOperationQueue. Wenn Sie keine Warteschlange angeben, können Benachrichtigungen in einem beliebigen Thread eintreffen, was zu Datenwettläufen führt. Verwenden Sie immer eine serielle OperationQueue zur Verarbeitung von Benachrichtigungen.

Der zweite Fehler ist das Blockieren in Präsentatormethoden. Protokollmethoden werden synchron vom Koordinator aufgerufen. Wenn der Präsentator einen längeren Vorgang ausführt (Datenbankschreiben, Netzwerkanfrage), blockiert er den Koordinator für alle anderen Teilnehmer. Verlagern Sie schwere Operationen in Hintergrundwarteschlangen.

Der dritte Fehler ist das Ignorieren von accommodatePresentedItemDeletion. Wenn der Präsentator diese Methode nicht implementiert und keinen Fehler zurückgibt, kann die Datei ohne Speichern des aktuellen Zustands gelöscht werden. Speichern Sie in dieser Methode immer Daten, wenn sie noch nicht auf die Festplatte geschrieben wurden.

Der vierte Fehler ist die zyklische Koordination. Wenn der Präsentator innerhalb einer Benachrichtigungsmethode den Koordinator erneut für dieselbe Datei aufruft, entsteht ein Deadlock. Überprüfen Sie das isCoordinatedOperation-Flag, bevor Sie innerhalb eines Handlers eine Koordination starten.

FehlerFolgeLösung
Keine OperationswarteschlangeDatenwettlauf bei MultithreadingOperationQueue angeben
Blockieren in MethodenKoordinator hängtIn Hintergrundthread verschieben
Ignorieren des LöschensDatenverlust beim LöschenSpeichern implementieren
Zyklische KoordinationAnwendungsdeadlockisCoordinatedOperation-Flag

Häufig gestellte Fragen

Warum brauchen wir NSFilePresenter, wenn NSFileHandle existiert?

NSFileHandle ist eine Low-Level-Schnittstelle zum Lesen und Schreiben von Daten, die keine Benachrichtigungsmechanismen für Änderungen durch andere Prozesse bietet. NSFilePresenter arbeitet auf Koordinationsebene: Es empfängt Ereignisse vom System, wenn sich eine Datei ändert, unabhängig von der Quelle — einem anderen Thread, Prozess oder iCloud.

Ist die Verwendung von NSFileCoordinator mit NSFilePresenter obligatorisch?

Ja. NSFilePresenter ergibt ohne NSFileCoordinator keinen Sinn. Der Präsentator definiert nur die Handlermethoden, während der Koordinator die Sperren verwaltet und diese Methoden aufruft. Wenn Sie NSFilePresenter ohne Koordinator verwenden, werden Benachrichtigungen nicht zugestellt.

Kann ein einzelnes Objekt Präsentator für mehrere Dateien sein?

Kann es, aber mit Einschränkungen. Die Eigenschaft presentedItemURL gibt nur eine URL zurück, daher wird zur Verfolgung mehrerer Dateien das NSFilePresenter-Protokoll mit zusätzlichen Methoden für Unterelemente verwendet. Eine Alternative ist die Erstellung einer separaten Präsentatorinstanz für jede Datei.

Wie arbeitet NSFilePresenter mit Sandbox in iOS?

NSFilePresenter ist vollständig mit der iOS-Sandbox kompatibel. Die Anwendung kann nur Dateien innerhalb ihres eigenen Containers verfolgen. Für den Zugriff auf Dateien anderer Anwendungen werden App Groups oder Security-Scoped Bookmarks verwendet. Der Koordinator arbeitet innerhalb der Sandbox-Berechtigungen.

Was tun, wenn presentedItemDidChange zu häufig aufgerufen wird?

Verwenden Sie Debounce oder Throttle innerhalb der presentedItemDidChange-Methode. Erstellen Sie einen Timer mit einer Verzögerung von 0,3–0,5 Sekunden und setzen Sie ihn bei jedem neuen Aufruf zurück. Führen Sie nach der Stabilisierung das Neuladen der Daten durch. Dies verhindert die mehrfache Verarbeitung eines einzelnen Änderungsbatches.

Zusammenfassung

  • NSFilePresenter — ein Foundation-Protokoll zum Empfangen von Dateiänderungsbenachrichtigungen in iOS und macOS, das ausschließlich in Verbindung mit NSFileCoordinator funktioniert.
  • Erforderliche Eigenschaft presentedItemURL — ohne sie kann das Objekt nicht als Präsentator registriert werden und erhält keine Benachrichtigungen.
  • Hauptmethode presentedItemDidChange wird nach jeder Änderung des Dateiinhalts aufgerufen — verwenden Sie sie zum Neuladen von Daten.
  • accommodatePresentedItemDeletion ermöglicht die korrekte Behandlung des Dateilöschens und das Speichern des aktuellen Anwendungszustands.
  • NSFileCoordinator verwaltet Sperren und garantiert die Atomizität von Operationen — ohne Koordinator ist der Präsentator nutzlos.
  • Häufige Fehler umfassen fehlende Operationswarteschlange, Blockieren in Methoden und zyklische Koordination — diese sollten durch geeignetes Design vermieden werden.
  • Debounce bei presentedItemDidChange bei häufigen Aufrufen — verwenden Sie einen Timer zum Bündeln von Änderungen vor dem Neuladen.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch