NSFilePresenter — ez egy Foundation protokoll, amely lehetővé teszi egy objektum számára, hogy értesítéseket kapjon a fájlok és könyvtárak változásairól az iOS és macOS fájlrendszerében. Az osztály implementálja a protokoll metódusait és regisztrál az NSFileCoordinatoron keresztül, ezután a rendszer automatikusan meghívja ezeket a metódusokat a követett fájllal végzett bármely műveletnél. Az Apple Developer Documentation (2025) szerint az NSFilePresenter többszálú dokumentumhozzáféréssel rendelkező alkalmazásokban használatos az írási konfliktusok megelőzésére. A protokoll kötelezően az NSFileCoordinatorral együtt használandó — csak így biztosítható a biztonságos hozzáférés-koordináció.
Főbb pontok
NSFilePresenter — egy Foundation protokoll, amely az Apple operációs rendszereiben a fájlok és könyvtárak változásainak követésére szolgál. A protokoll meghatározza azon metódusok halmazát, amelyeket a megfigyelő objektum implementál a fájlrendszer eseményeiről szóló értesítések fogadásához.
A protokoll fő feladata a biztonságos fájlhozzáférés biztosítása többszálú forgatókönyvekben. iOS és macOS rendszerben több folyamat és szál is hozzáférhet egyszerre ugyanahhoz a fájlhoz az NSFileCoordinator segítségével, és az NSFilePresenter garantálja, hogy minden résztvevő a legfrissebb adatállapotot kapja.
A protokoll az iOS 5.0 és macOS 10.7 óta része a Foundation keretrendszernek. Olyan alkalmazásokban használják, amelyek dokumentumokkal, adatbázisokkal és bármilyen fájllal dolgoznak, amelyek különböző forrásokból egyidejűleg változhatnak — például iCloud szinkronizálás vagy közös szerkesztés során.
Dokumentum-orientált alkalmazások — az NSFilePresenter fő alkalmazási területe. Az UIDocument vagy NSDocument használatával dolgozó alkalmazások automatikusan regisztrálják magukat presenter-ként az NSFileCoordinatoron keresztül. Ez lehetővé teszi a konfliktusok helyes kezelését, amikor ugyanazt a fájlt több ablakból vagy eszközről szerkesztik.
iCloud szinkronizálás — a második kulcsfontosságú forgatókönyv. Amikor egy fájl változik az egyik eszközön, az iCloud szinkronizálja az összes csatlakoztatott eszközön. Az NSFilePresenter értesíti az alkalmazást ezekről a változásokról, lehetővé téve a felület időben történő frissítését.
Többszálú szerkesztők — a harmadik forgatókönyv. Azokban az alkalmazásokban, ahol a háttérvárakozási sorok a felhasználó munkájával egyidejűleg töltik be és mentik az adatokat, az NSFilePresenter megakadályozza a versenyhelyzeteket a fájlok írása és olvasása során.
Működési mechanizmus Az NSFilePresenter a delegálási modellen alapul: az objektum implementálja a protokoll metódusait, regisztrál az NSFileCoordinatoron keresztül, és meghívásokat kap a követett fájl minden változásakor. A rendszer maga határozza meg, hogy mikor történt változás és mely metódusokat kell meghívni.
A folyamat azzal kezdődik, hogy az objektum létrehoz egy NSFileCoordinator példányt, és meghívja a koordinátor metódusát a fájl URL-jének átadásával. A koordinátor ellenőrzi, hogy ehhez az URL-hez regisztráltak-e valamilyen presentert. Ha igen, blokkolja az olvasási vagy írási hozzáférést, és értesíti a prezentereket a közelgő változásról a protokoll metódusain keresztül.
A művelet befejezése után a koordinátor feloldja a blokkolást és meghívja a végső értesítéseket. Fontos, hogy a presenter nem irányítja a végrehajtási folyamatot — csak reagál az eseményekre. A koordinációért teljes mértékben az NSFileCoordinator felelős.
Előkészítési fázis — a művelet végrehajtása előtt a koordinátor meghívja az accommodatePresentedItemDeletion vagy accommodatePresentedSubitemDeletion metódust. A presenter kezelheti a helyzetet, vagy visszavonhatja a műveletet egy hiba visszaadásával. Ez a fázis lehetővé teszi az alkalmazás számára, hogy megfelelően befejezze a fájllal való munkát annak módosítása előtt.
Értesítési fázis — a művelet befejezése után a koordinátor meghívja a presentedItemDidChange vagy presentedSubitemDidChange metódust. A presenter jelet kap arról, hogy a fájl megváltozott, és újraolvashatja annak tartalmát. A fájl áthelyezéséhez a presentedItemDidMoveToURL kerül meghívásra az új helyszínnel.
Befejezési fázis — a koordinátor feloldja az összes blokkolást és felszabadítja az erőforrásokat. A presenter folytathatja a munkát a frissített adatokkal. Mindhárom fázis szinkron módon, ugyanabban a szálban hajtódik végre, ezért a protokoll metódusainak gyorsan kell futniuk, hosszú bemeneti-kimeneti műveletek nélkül.
Az NSFilePresenter protokoll több kötelező és opcionális metódust tartalmaz. Az egyetlen kötelező tulajdonság a presentedItemURL, amely visszaadja a követett fájl vagy könyvtár URL-jét. E tulajdonság nélkül az objektum nem regisztrálható presenter-ként.
presentedItemURL — URL? típusú tulajdonság, amelynek vissza kell adnia a követett fájl elérési útját. Ha az objektum több fájlt követ, a tulajdonság a fő elem URL-jét adja vissza. Könyvtárak esetén a könyvtár saját URL-je kerül visszaadásra.
presentedItemDidChange — a követett fájl tartalmának megváltozása után hívódik meg. Ebben a metódusban a presenter frissíti belső állapotát és újratölti az adatokat. Ez a metódus nem kap információt arról, hogy pontosan mi változott — csak a változás tényét közli.
accommodatePresentedItemDeletion — a fájl törlése előtt hívódik meg. A presenter elmentheti az aktuális állapotot, bezárhatja a fájlleírókat, vagy visszavonhatja a műveletet egy NSError visszaadásával. Ha a metódus hibát ad vissza, a törlési művelet nem hajtódik végre.
presentedItemDidMoveToURL — a fájl áthelyezése vagy átnevezése után hívódik meg. A metódus megkapja az új URL-t, és a presenternek frissítenie kell a fájlra mutató hivatkozást. E metódus implementálása nélkül a presenter továbbra is a régi, nem létező elérési útra fog mutatni.
NSFileCoordinator és NSFilePresenter — elválaszthatatlan páros. Az NSFileCoordinator kezeli a fájlokhoz való hozzáférést és meghívja a presenter metódusait. A presenter nem dolgozik közvetlenül a fájlrendszerrel — minden művelet a koordinátoron keresztül történik, aki garantálja a változtatások atomosságát.
A koordinátor az NSFileCoordinator osztály addFilePresenter metódusán keresztül regisztrálja a presentert. A hozzáadás után a presenter elkezd értesítéseket kapni. Az eltávolítás a removeFilePresenter segítségével történik. A rendszer gyenge hivatkozást tart a presenter-re, ezért az objektumnak életben kell maradnia a teljes követési időszak alatt.
Az Apple WWDC 2022 szerint az NSFileCoordinator magszintű koordinációs mechanizmust használ, ami minimális késleltetést biztosít a zárolásoknál. Az iOS legújabb verzióiban a koordinátor optimalizálva van a Sandbox és az alkalmazásbővítmények használatához.
Intention — minden olvasási vagy írási műveletet koordinációs blokkba kell csomagolni: olvasás a coordinateReadingItemAtURL, írás a coordinateWritingItemAtURL segítségével. A koordinátor automatikusan zárolja a fájlt más résztvevők számára a blokk végrehajtásának idejére.
Batch koordináció — több fájllal végzett műveletek esetén batch koordináció használatos. A koordinátor atomi módon zárolja az összes megadott fájlt, végrehajtja a műveletet, és feloldja a zárolásokat. Ez kritikus fontosságú dokumentumkészletek áthelyezése vagy másolása során.
Hozzuk létre a DocumentPresenter osztályt, amely implementálja az NSFilePresenter protokollt és követi a dokumentumfájl változásait. Az osztály tartalmaz egy hivatkozást a fájlra, belső adatokat és egy aktualitás jelzőt.
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) {
// Dokumentum adatainak feldolgozása
}
}
Az osztály implementálja a presentedItemDidChange metódust az adatok újratöltéséhez fájlváltozáskor, és az accommodatePresentedItemDeletion metódust az állapot mentéséhez törlés előtt. A műveleti sor garantálja, hogy minden értesítés egymás után kerül feldolgozásra.
A presenter regisztrációja a dokumentum megnyitásakor történik az NSFileCoordinator.addFilePresenter segítségével. Fontos, hogy a megfelelő olvasási opciókat adjuk át a koordinátornak — withoutChanges a módosítás nélküli műveletekhez vagy immediatelyAvailable az azonnali hozzáférést igénylő forgatókönyvekhez.
Az első gyakori hiba — a presentedItemOperationQueue implementálásának hiánya. Ha nem ad meg sort, az értesítések bármilyen szálban érkezhetnek, adatversenyt okozva. Mindig használjon szekvenciális OperationQueue-t az értesítések feldolgozásához.
A második hiba — blokkolás a presenter metódusaiban. A protokoll metódusai szinkron módon hívódnak meg a koordinátorból. Ha a presenter hosszú ideig tartó műveletet hajt végre (adatbázisba írás, hálózati kérés), blokkolja a koordinátort az összes többi résztvevő számára. Helyezze át a nehéz műveleteket háttérvárakozási sorokba.
A harmadik hiba — az accommodatePresentedItemDeletion figyelmen kívül hagyása. Ha a presenter nem implementálja ezt a metódust és nem ad vissza hibát, a fájl törölhető az aktuális állapot mentése nélkül. Mindig mentse az adatokat ebben a metódusban, ha még nem lettek lemezre írva.
A negyedik hiba — ciklikus koordináció. Amikor a presenter az értesítési metóduson belül ismét meghívja a koordinátort ugyanahhoz a fájlhoz, deadlock keletkezik. Ellenőrizze az isCoordinatedOperation jelzőt a koordináció elindítása előtt a handlerekben.
| Hiba | Következmény | Megoldás |
|---|---|---|
| Nincs műveleti sor | Adatverseny több szálban | OperationQueue megadása |
| Blokkolás a metódusokban | A koordinátor lefagy | Háttérszálba helyezés |
| A deletion figyelmen kívül hagyása | Adatvesztés törléskor | Mentés implementálása |
| Ciklikus koordináció | Alkalmazás deadlock | isCoordinatedOperation jelző |
Gyakran Ismételt Kérdések
NSFileHandle — egy alacsony szintű interfész adatok olvasására és írására, amely nem biztosít értesítési mechanizmusokat más folyamatok változásairól. Az NSFilePresenter koordinációs szinten működik: eseményeket kap a rendszertől a fájl bármilyen változásakor, függetlenül a forrástól — másik szál, folyamat vagy iCloud.
Igen. Az NSFilePresenter-nek nincs értelme NSFileCoordinator nélkül. A presenter csak a kezelő metódusokat határozza meg, míg a koordinátor kezeli a zárolásokat és meghívja ezeket a metódusokat. Ha a presentert koordinátor nélkül használja, az értesítések nem kerülnek kézbesítésre.
Lehet, de korlátozásokkal. A presentedItemURL tulajdonság csak egy URL-t ad vissza, ezért több fájl követéséhez az NSFilePresenter protokoll használatos kiegészítő metódusokkal az al-elemekhez. Alternatíva — külön presenter példány létrehozása minden fájlhoz.
NSFilePresenter teljes mértékben kompatibilis az iOS homokozóval. Az alkalmazás csak a saját tárolóján belüli fájlokat követheti. Más alkalmazások fájljaihoz való hozzáféréshez App Groups vagy Security-Scoped Bookmark használatos. A koordinátor a homokozó engedélyeinek keretein belül működik.
Használjon debounce vagy throttle technikát a presentedItemDidChange metóduson belül. Hozzon létre egy időzítőt 0,3-0,5 másodperces késleltetéssel, és állítsa vissza azt minden új híváskor. Stabilizálódás után hajtsa végre az adatok újratöltését. Ez megakadályozza ugyanazon változtatáscsomag többszöri feldolgozását.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is