NSFilePresenter — is een Foundation-protocol waarmee een object meldingen kan ontvangen over wijzigingen in bestanden en mappen in het bestandssysteem van iOS en macOS. De klasse implementeert de methoden van het protocol en registreert zich via NSFileCoordinator, waarna het systeem deze methoden automatisch aanroept bij elke bewerking met het gevolgde bestand. Volgens Apple Developer Documentation (2025) wordt NSFilePresenter gebruikt in applicaties met multi-thread toegang tot documenten om schrijfconflicten te voorkomen. Het protocol wordt verplicht gebruikt in combinatie met NSFileCoordinator — alleen zo wordt veilige toegangscoördinatie gegarandeerd.
Belangrijkste punten
NSFilePresenter — is een Foundation-protocol ontworpen voor het bijhouden van wijzigingen in bestanden en mappen in Apple besturingssystemen. Het protocol definieert een reeks methoden die het waarnemende object implementeert om meldingen te ontvangen over gebeurtenissen in het bestandssysteem.
De hoofdtaak van het protocol is het waarborgen van veilige toegang tot bestanden in multi-thread scenario's. In iOS en macOS kunnen meerdere processen en threads tegelijkertijd via NSFileCoordinator toegang krijgen tot hetzelfde bestand, en NSFilePresenter garandeert dat elke deelnemer de actuele gegevensstatus ontvangt.
Het protocol is opgenomen in Foundation vanaf iOS 5.0 en macOS 10.7. Het wordt gebruikt in applicaties die werken met documenten, databases en alle bestanden die gelijktijdig uit verschillende bronnen kunnen worden gewijzigd — bijvoorbeeld bij synchronisatie via iCloud of bij gezamenlijk bewerken.
Documentgeoriënteerde applicaties — het belangrijkste toepassingsgebied van NSFilePresenter. Applicaties die met UIDocument of NSDocument werken, registreren zich automatisch als presenters via NSFileCoordinator. Dit maakt het mogelijk om conflicten correct af te handelen bij het bewerken van hetzelfde bestand vanuit meerdere vensters of apparaten.
iCloud synchronisatie — het tweede belangrijke scenario. Wanneer een bestand op het ene apparaat verandert, synchroniseert iCloud het op alle aangesloten apparaten. NSFilePresenter stelt de applicatie op de hoogte van deze wijzigingen, waardoor de interface tijdig kan worden bijgewerkt.
Multi-thread editors — het derde scenario. In applicaties waar achtergrondwachtrijen gegevens laden en opslaan gelijktijdig met het werk van de gebruiker, voorkomt NSFilePresenter racecondities bij het schrijven en lezen van bestanden.
Werkingsmechanisme NSFilePresenter is gebaseerd op het delegatiemodel: het object implementeert de protocolmethoden, registreert zich via NSFileCoordinator en ontvangt aanroepen bij elke wijziging van het gevolgde bestand. Het systeem bepaalt zelf wanneer een wijziging heeft plaatsgevonden en welke methoden moeten worden aangeroepen.
Het proces begint met het maken van een NSFileCoordinator instantie door het object en het aanroepen van de coördinatormethode met de URL van het bestand. De coördinator controleert of er voor deze URL presenters zijn geregistreerd. Zo ja, dan blokkeert hij de lees- of schrijftoegang en stelt de presenters op de hoogte van de aanstaande wijziging via de protocolmethoden.
Na voltooiing van de bewerking heft de coördinator de blokkade op en roept de eindmeldingen aan. Het is belangrijk dat de presenter de uitvoeringsstroom niet beheert — hij reageert alleen op gebeurtenissen. NSFileCoordinator is volledig verantwoordelijk voor de coördinatie.
Voorbereidingsfase — voor het uitvoeren van de bewerking roept de coördinator de methode accommodatePresentedItemDeletion of accommodatePresentedSubitemDeletion aan. De presenter kan de situatie verwerken of de bewerking annuleren door een fout terug te geven. Deze fase stelt de applicatie in staat om netjes met het bestand af te sluiten voordat het wordt gewijzigd.
Meldingsfase — na voltooiing van de bewerking roept de coördinator presentedItemDidChange of presentedSubitemDidChange aan. De presenter ontvangt een signaal dat het bestand is gewijzigd en kan de inhoud opnieuw lezen. Voor het verplaatsen van een bestand wordt presentedItemDidMoveToURL aangeroepen met de nieuwe locatie.
Afsluitingsfase — de coördinator heft alle blokkades op en geeft bronnen vrij. De presenter kan verder werken met bijgewerkte gegevens. Alle drie de fasen worden synchroon in dezelfde thread uitgevoerd, daarom moeten de protocolmethoden snel werken, zonder lange invoer-uitvoer bewerkingen.
Het NSFilePresenter protocol bevat verschillende verplichte en optionele methoden. De enige verplichte eigenschap is presentedItemURL, die de URL van het gevolgde bestand of map retourneert. Zonder deze eigenschap kan het object niet worden geregistreerd als presenter.
presentedItemURL — een eigenschap van het type URL? die het pad naar het gevolgde bestand moet retourneren. Als het object meerdere bestanden volgt, retourneert de eigenschap de URL van het hoofdelement. Voor mappen wordt de URL van de map zelf geretourneerd.
presentedItemDidChange — wordt aangeroepen na wijziging van de inhoud van het gevolgde bestand. In deze methode werkt de presenter zijn interne status bij en laadt de gegevens opnieuw. Deze methode ontvangt geen informatie over wat er precies is gewijzigd — alleen het feit van de wijziging.
accommodatePresentedItemDeletion — wordt aangeroepen voor het verwijderen van een bestand. De presenter kan de huidige status opslaan, bestandsdescriptors sluiten of de bewerking annuleren door NSError terug te geven. Als de methode een fout retourneert, wordt de verwijderbewerking niet uitgevoerd.
presentedItemDidMoveToURL — wordt aangeroepen na het verplaatsen of hernoemen van een bestand. De methode ontvangt de nieuwe URL en de presenter moet de verwijzing naar het bestand bijwerken. Zonder implementatie van deze methode blijft de presenter naar het oude, niet-bestaande pad verwijzen.
NSFileCoordinator en NSFilePresenter — een onafscheidelijk paar. NSFileCoordinator beheert de toegang tot bestanden en roept de methoden van de presenter aan. De presenter werkt niet rechtstreeks met het bestandssysteem — alle bewerkingen verlopen via de coördinator, die de atomiciteit van wijzigingen garandeert.
De coördinator registreert de presenter via de methode addFilePresenter van de klasse NSFileCoordinator. Na toevoeging begint de presenter meldingen te ontvangen. Verwijdering gebeurt via removeFilePresenter. Het systeem bewaart een zwakke verwijzing naar de presenter, daarom moet het object gedurende de hele volgperiode in leven blijven.
Volgens Apple WWDC 2022 gebruikt NSFileCoordinator een coördinatiemechanisme op kernelniveau, wat minimale vertraging bij blokkades garandeert. In de nieuwste versies van iOS is de coördinator geoptimaliseerd voor samenwerking met Sandbox en applicatie-uitbreidingen.
Intention — elke lees- of schrijfbewerking moet worden ingepakt in een coördinatieblok: lezen via coordinateReadingItemAtURL, schrijven via coordinateWritingItemAtURL. De coördinator blokkeert automatisch het bestand voor andere deelnemers tijdens de uitvoering van het blok.
Batchcoördinatie — voor bewerkingen met meerdere bestanden wordt batchcoördinatie gebruikt. De coördinator blokkeert atomair alle opgegeven bestanden, voert de bewerking uit en heft de blokkades op. Dit is cruciaal bij het verplaatsen of kopiëren van documentsets.
Laten we de klasse DocumentPresenter maken die het NSFilePresenter protocol implementeert en de wijzigingen van een documentbestand volgt. De klasse bevat een verwijzing naar het bestand, interne gegevens en een actualiteitsvlag.
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) {
// Documentgegevensverwerking
}
}
De klasse implementeert presentedItemDidChange voor het opnieuw laden van gegevens bij bestandswijziging en accommodatePresentedItemDeletion voor het opslaan van de status voor verwijdering. De bewerkingswachtrij garandeert dat alle meldingen sequentieel worden verwerkt.
Registratie van de presenter gebeurt via NSFileCoordinator.addFilePresenter bij het openen van het document. Het is belangrijk om de juiste leesopties aan de coördinator door te geven — withoutChanges voor bewerkingen zonder wijziging of immediatelyAvailable voor scenario's met onmiddellijke toegang.
De eerste veelgemaakte fout — het ontbreken van de implementatie van presentedItemOperationQueue. Als u geen wachtrij opgeeft, kunnen meldingen in een willekeurige thread aankomen, wat gegevensrace veroorzaakt. Gebruik altijd een sequentiële OperationQueue voor het verwerken van meldingen.
De tweede fout — blokkeren in de methoden van de presenter. De protocolmethoden worden synchroon vanuit de coördinator aangeroepen. Als de presenter een langdurige bewerking uitvoert (schrijven naar database, netwerkverzoek), blokkeert hij de coördinator voor alle andere deelnemers. Verplaats zware bewerkingen naar achtergrondwachtrijen.
De derde fout — het negeren van accommodatePresentedItemDeletion. Als de presenter deze methode niet implementeert en geen fout retourneert, kan het bestand worden verwijderd zonder de huidige status op te slaan. Sla altijd gegevens op in deze methode als ze nog niet naar schijf zijn geschreven.
De vierde fout — cyclische coördinatie. Wanneer de presenter binnen de meldingsmethode opnieuw de coördinator voor hetzelfde bestand aanroept, ontstaat er een deadlock. Controleer de isCoordinatedOperation vlag voordat u coördinatie start binnen de handler.
| Fout | Gevolg | Oplossing |
|---|---|---|
| Geen bewerkingswachtrij | Gegevensrace in multi-threading | OperationQueue opgeven |
| Blokkeren in methoden | Coördinator vastlopen | Naar achtergrondthread verplaatsen |
| Negeren van deletion | Gegevensverlies bij verwijdering | Opslaan implementeren |
| Cyclische coördinatie | Deadlock van applicatie | isCoordinatedOperation vlag |
Veelgestelde vragen
NSFileHandle — is een laag-niveau interface voor het lezen en schrijven van gegevens die geen mechanismen biedt voor melding van wijzigingen vanuit andere processen. NSFilePresenter werkt op coördinatieniveau: het ontvangt gebeurtenissen van het systeem bij elke bestandswijziging, ongeacht de bron — een andere thread, proces of iCloud.
Ja. NSFilePresenter heeft geen zin zonder NSFileCoordinator. De presenter definieert alleen de afhandelingsmethoden, terwijl de coördinator de blokkades beheert en deze methoden aanroept. Als u NSFilePresenter zonder coördinator gebruikt, worden meldingen niet afgeleverd.
Kan, maar met beperkingen. De eigenschap presentedItemURL retourneert slechts één URL, daarom wordt voor het volgen van meerdere bestanden het NSFilePresenter protocol gebruikt met aanvullende methoden voor subelementen. Alternatief — het maken van een aparte presenter instantie voor elk bestand.
NSFilePresenter is volledig compatibel met de iOS sandbox. De applicatie kan alleen bestanden binnen zijn eigen container volgen. Voor toegang tot bestanden van andere applicaties worden App Groups of Security-Scoped Bookmark gebruikt. De coördinator werkt binnen de sandbox-machtigingen.
Gebruik debounce of throttle binnen de presentedItemDidChange methode. Maak een timer met een vertraging van 0,3-0,5 seconden en reset deze bij elke nieuwe aanroep. Voer na stabilisatie het opnieuw laden van gegevens uit. Dit voorkomt meervoudige verwerking van hetzelfde wijzigingspakket.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook