NSFilePresenter — är ett Foundation-protokoll som gör att ett objekt kan ta emot aviseringar om ändringar av filer och kataloger i iOS och macOS filsystem. Klassen implementerar protokollets metoder och registrerar sig via NSFileCoordinator, varefter systemet automatiskt anropar dessa metoder vid varje operation med den spårade filen. Enligt Apple Developer Documentation (2025) används NSFilePresenter i applikationer med flertrådad åtkomst till dokument för att förhindra skrivkonflikter. Protokollet används obligatoriskt tillsammans med NSFileCoordinator — endast så säkerställs säker åtkomstkoordinering.
Huvudpunkter
NSFilePresenter — är ett Foundation-protokoll utformat för att spåra ändringar av filer och kataloger i Apples operativsystem. Protokollet definierar en uppsättning metoder som observatörobjektet implementerar för att ta emot aviseringar om filsystemhändelser.
Protokollets huvuduppgift är att säkerställa säker åtkomst till filer i flertrådade scenarier. I iOS och macOS kan flera processer och trådar samtidigt komma åt samma fil via NSFileCoordinator, och NSFilePresenter garanterar att varje deltagare får den aktuella datastatusen.
Protokollet ingår i Foundation sedan iOS 5.0 och macOS 10.7. Det används i applikationer som arbetar med dokument, databaser och alla filer som kan ändras samtidigt från olika källor — till exempel vid synkronisering via iCloud eller gemensam redigering.
Dokumentorienterade applikationer — det huvudsakliga användningsområdet för NSFilePresenter. Applikationer som arbetar med UIDocument eller NSDocument registrerar sig automatiskt som presentationsobjekt via NSFileCoordinator. Detta gör det möjligt att korrekt hantera konflikter när samma fil redigeras från flera fönster eller enheter.
iCloud-synkronisering — det andra nyckelscenariot. När en fil ändras på en enhet synkroniserar iCloud den på alla anslutna enheter. NSFilePresenter meddelar applikationen om dessa ändringar, vilket möjliggör tidsenlig uppdatering av gränssnittet.
Flertrådade redigerare — det tredje scenariot. I applikationer där bakgrundsköer laddar och sparar data samtidigt med användarens arbete förhindrar NSFilePresenter race conditions vid skrivning och läsning av filer.
Funktionsmekanism NSFilePresenter är baserad på delegationsmodellen: objektet implementerar protokollets metoder, registrerar sig via NSFileCoordinator och får anrop vid varje ändring av den spårade filen. Systemet bestämmer själv när en ändring har inträffat och vilka metoder som ska anropas.
Processen börjar med att objektet skapar en instans av NSFileCoordinator och anropar koordinatorns metod med filens URL. Koordinatorn kontrollerar om det finns några registrerade presentationsobjekt för denna URL. Om så är fallet blockerar den läs- eller skrivåtkomst och meddelar presentationsobjekten om den kommande ändringen via protokollets metoder.
Efter att operationen slutförts tar koordinatorn bort blockeringen och anropar slutliga aviseringar. Det är viktigt att presentationsobjektet inte hanterar exekveringsflödet — det reagerar bara på händelser. NSFileCoordinator är helt ansvarig för koordineringen.
Förberedelsefas — före utförandet av operationen anropar koordinatorn metoden accommodatePresentedItemDeletion eller accommodatePresentedSubitemDeletion. Presentationsobjektet kan hantera situationen eller avbryta operationen genom att returnera ett fel. Denna fas gör det möjligt för applikationen att korrekt avsluta arbetet med filen innan den ändras.
Aviseringsfas — efter att operationen slutförts anropar koordinatorn presentedItemDidChange eller presentedSubitemDidChange. Presentationsobjektet får en signal om att filen har ändrats och kan läsa om dess innehåll. För filflyttning anropas presentedItemDidMoveToURL med den nya platsen.
Slutförandefas — koordinatorn tar bort alla blockeringar och frigör resurser. Presentationsobjektet kan fortsätta arbeta med uppdaterad data. Alla tre faser körs synkront i samma tråd, därför måste protokollets metoder fungera snabbt, utan långa in- och utdataoperationer.
NSFilePresenter protokollet innehåller flera obligatoriska och valfria metoder. Den enda obligatoriska egenskapen är presentedItemURL, som returnerar URL:en för den spårade filen eller katalogen. Utan denna egenskap kan objektet inte registreras som presentationsobjekt.
presentedItemURL — egenskap av typen URL? som måste returnera sökvägen till den spårade filen. Om objektet spårar flera filer returnerar egenskapen URL:en för huvudelementet. För kataloger returneras katalogens egen URL.
presentedItemDidChange — anropas efter ändring av innehållet i den spårade filen. I denna metod uppdaterar presentationsobjektet sitt interna tillstånd och laddar om data. Denna metod tar inte emot information om vad som exakt ändrades — endast faktumet att en ändring skett.
accommodatePresentedItemDeletion — anropas före borttagning av fil. Presentationsobjektet kan spara aktuellt tillstånd, stänga filbeskrivare eller avbryta operationen genom att returnera NSError. Om metoden returnerar ett fel utförs inte borttagningsoperationen.
presentedItemDidMoveToURL — anropas efter flyttning eller omdöpning av fil. Metoden tar emot den nya URL:en och presentationsobjektet måste uppdatera referensen till filen. Utan implementering av denna metod kommer presentationsobjektet fortsätta att peka på den gamla, obefintliga sökvägen.
NSFileCoordinator och NSFilePresenter — ett oskiljaktigt par. NSFileCoordinator hanterar åtkomst till filer och anropar presentationsobjektets metoder. Presentationsobjektet arbetar inte direkt med filsystemet — alla operationer går via koordinatorn som garanterar ändringars atomicitet.
Koordinatorn registrerar presentationsobjektet via metoden addFilePresenter i klassen NSFileCoordinator. Efter tillägg börjar presentationsobjektet ta emot aviseringar. Borttagning sker via removeFilePresenter. Systemet håller en svag referens till presentationsobjektet, därför måste objektet vara vid liv under hela spårningsperioden.
Enligt Apple WWDC 2022 använder NSFileCoordinator en koordineringsmekanism på kärnnivå, vilket säkerställer minimal fördröjning vid blockeringar. I de senaste versionerna av iOS är koordinatorn optimerad för arbete med Sandbox och applikationstillägg.
Intention — varje läs- eller skrivoperation måste vara insvept i ett koordineringsblock: läsning via coordinateReadingItemAtURL, skrivning via coordinateWritingItemAtURL. Koordinatorn låser automatiskt filen för andra deltagare under blockets exekvering.
Batchkoordinering — för operationer med flera filer används batchkoordinering. Koordinatorn låser atomiskt alla specificerade filer, utför operationen och tar bort låsningarna. Detta är kritiskt vid flyttning eller kopiering av dokumentuppsättningar.
Låt oss skapa klassen DocumentPresenter som implementerar NSFilePresenter-protokollet och spårar ändringar av dokumentfilen. Klassen innehåller en referens till filen, intern data och en aktualitetsflagga.
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) {
// Dokumentdatabehandling
}
}
Klassen implementerar presentedItemDidChange för omladdning av data vid filändring och accommodatePresentedItemDeletion för att spara tillstånd före borttagning. Operationskön garanterar att alla aviseringar bearbetas sekventiellt.
Registrering av presentationsobjektet sker via NSFileCoordinator.addFilePresenter vid öppning av dokumentet. Det är viktigt att skicka korrekta läsalternativ till koordinatorn — withoutChanges för operationer utan ändring eller immediatelyAvailable för scenarier med omedelbar åtkomst.
Det första vanliga felet — avsaknad av implementering av presentedItemOperationQueue. Om du inte anger en kö kan aviseringar komma i godtycklig tråd, vilket orsakar datarace. Använd alltid en sekventiell OperationQueue för bearbetning av aviseringar.
Det andra felet — blockering i presentationsobjektets metoder. Protokollets metoder anropas synkront från koordinatorn. Om presentationsobjektet utför en långvarig operation (databasinskrivning, nätverksförfrågan) blockerar det koordinatorn för alla andra deltagare. Flytta tunga operationer till bakgrundsköer.
Det tredje felet — ignorering av accommodatePresentedItemDeletion. Om presentationsobjektet inte implementerar denna metod och inte returnerar ett fel kan filen tas bort utan att aktuellt tillstånd sparas. Spara alltid data i denna metod om den inte redan har skrivits till disk.
Det fjärde felet — cyklisk koordinering. När presentationsobjektet inuti aviseringsmetoden igen anropar koordinatorn för samma fil uppstår en deadlock. Kontrollera flaggan isCoordinatedOperation innan du startar koordinering inuti hanteraren.
| Fel | Konsekvens | Lösning |
|---|---|---|
| Ingen operationskö | Datarace i flertrådning | Ange OperationQueue |
| Blockering i metoder | Koordinatorn hänger | Flytta till bakgrundstråd |
| Ignorering av deletion | Dataförlust vid borttagning | Implementera sparande |
| Cyklisk koordinering | Applikation deadlock | isCoordinatedOperation-flagga |
Vanliga frågor
NSFileHandle — är ett lågnivågränssnitt för att läsa och skriva data som inte tillhandahåller mekanismer för avisering om ändringar från andra processer. NSFilePresenter arbetar på koordineringsnivå: den tar emot händelser från systemet vid varje filändring, oavsett källa — annan tråd, process eller iCloud.
Ja. NSFilePresenter är meningslöst utan NSFileCoordinator. Presentationsobjektet definierar bara hanteringsmetoderna, medan koordinatorn hanterar låsningarna och anropar dessa metoder. Om du använder NSFilePresenter utan koordinator kommer aviseringar inte att levereras.
Kan, men med begränsningar. Egenskapen presentedItemURL returnerar bara en URL, därför används NSFilePresenter-protokollet med ytterligare metoder för underelement för att spåra flera filer. Alternativ — skapa en separat presentationsobjektsinstans för varje fil.
NSFilePresenter är helt kompatibel med iOS sandbox. Applikationen kan bara spåra filer inom sin egen behållare. För åtkomst till andra applikationers filer används App Groups eller Security-Scoped Bookmark. Koordinatorn arbetar inom sandboxens behörigheter.
Använd debounce eller throttle inuti metoden presentedItemDidChange. Skapa en timer med en fördröjning på 0,3-0,5 sekunder och återställ den vid varje nytt anrop. Efter stabilisering utför du omladdning av data. Detta förhindrar flera bearbetningar av samma ändringspaket.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också