NSFilePresenter — ово је протокол Foundation који омогућава објекту да прима обавештења о променама датотека и директоријума у систему датотека iOS и macOS. Класа имплементира методе протокола и региструје се преко NSFileCoordinator, након чега систем аутоматски позива ове методе при свакој операцији са надгледаном датотеком. Према Apple Developer Documentation (2025), NSFilePresenter се користи у апликацијама са вишеструким приступом документима ради спречавања конфликата при упису. Протокол се обавезно користи у комбинацији са NSFileCoordinator — само тако се обезбеђује безбедна координација приступа.
Главне тачке
NSFilePresenter — ово је протокол Foundation намењен за праћење промена датотека и директоријума у Apple оперативним системима. Протокол дефинише скуп метода које објекат-посматрач имплементира за примање обавештења о догађајима система датотека.
Основни задатак протокола је обезбеђивање безбедног приступа датотекама у сценаријима са више нити. У iOS и macOS, више процеса и нити може истовремено приступити истој датотеци преко NSFileCoordinator, а NSFilePresenter гарантује да сваки учесник добија ажурно стање података.
Протокол је укључен у Foundation од iOS 5.0 и macOS 10.7. Користи се у апликацијама које раде са документима, базама података и било којим датотекама које се могу мењати истовремено из различитих извора — на пример, при синхронизацији преко iCloud или при заједничком уређивању.
Апликације оријентисане на документе — главна област употребе NSFilePresenter. Апликације које раде са UIDocument или NSDocument аутоматски се региструју као презентери преко NSFileCoordinator. Ово омогућава правилно обраду конфликата при уређивању исте датотеке из више прозора или уређаја.
iCloud синхронизација — други кључни сценарио. Када се датотека промени на једном уређају, iCloud је синхронизује на свим повезаним уређајима. NSFilePresenter обавештава апликацију о овим променама, омогућавајући благовремено ажурирање интерфејса.
Уређивачи са више нити — трећи сценарио. У апликацијама где позадински редови учитавају и чувају податке истовремено са радом корисника, NSFilePresenter спречава услове трке при упису и читању датотека.
Механизам рада NSFilePresenter се заснива на моделу делегирања: објекат имплементира методе протокола, региструје се преко NSFileCoordinator и прима позиве при свакој промени надгледане датотеке. Систем сам одређује када се догодила промена и које методе треба позвати.
Процес почиње тако што објекат креира инстанцу NSFileCoordinator и позива методу координатора прослеђујући URL датотеке. Координатор проверава да ли су за овај URL регистровани неки презентери. Ако јесу, блокира приступ за читање или упис и обавештава презентере о предстојећој промени преко метода протокола.
Након завршетка операције, координатор уклања блокаду и позива коначна обавештења. Важно је да презентер не управља током извршавања — он само реагује на догађаје. За координацију је у потпуности одговоран NSFileCoordinator.
Фаза припреме — пре извршења операције, координатор позива методу accommodatePresentedItemDeletion или accommodatePresentedSubitemDeletion. Презентер може да обради ситуацију или да откаже операцију враћањем грешке. Ова фаза омогућава апликацији да правилно заврши рад са датотеком пре њене измене.
Фаза обавештења — након завршетка операције, координатор позива presentedItemDidChange или presentedSubitemDidChange. Презентер добија сигнал да се датотека променила и може поново да прочита њен садржај. За премештање датотеке позива се presentedItemDidMoveToURL са новом локацијом.
Фаза завршетка — координатор уклања све блокаде и ослобађа ресурсе. Презентер може да настави рад са ажурираним подацима. Све три фазе се извршавају синхроно у једној нити, стога методе протокола морају брзо да се извршавају, без дугих улазно-излазних операција.
Протокол NSFilePresenter садржи неколико обавезних и опционих метода. Једино обавезно својство је presentedItemURL, које враћа URL надгледане датотеке или директоријума. Без овог својства, објекат не може бити регистрован као презентер.
presentedItemURL — својство типа URL? које мора да врати путању до надгледане датотеке. Ако објекат надгледа више датотека, својство враћа URL главног елемента. За директоријуме се враћа URL самог директоријума.
presentedItemDidChange — позива се након промене садржаја надгледане датотеке. У овој методи презентер ажурира своје унутрашње стање и поново учитава податке. Ова метода не прима информацију о томе шта се тачно променило — само чињеницу промене.
accommodatePresentedItemDeletion — позива се пре брисања датотеке. Презентер може да сачува тренутно стање, затвори дескрипторе датотека или да откаже операцију враћањем NSError. Ако метода врати грешку, операција брисања се не извршава.
presentedItemDidMoveToURL — позива се након премештања или преименовања датотеке. Метода прима нови URL, а презентер мора да ажурира референцу на датотеку. Без имплементације ове методе, презентер ће наставити да показује на стару, непостојећу путању.
NSFileCoordinator и NSFilePresenter — нераздвојни пар. NSFileCoordinator управља приступом датотекама и позива методе презентера. Презентер не ради директно са системом датотека — све операције пролазе кроз координатора који гарантује атомичност промена.
Координатор региструје презентера преко методе addFilePresenter класе NSFileCoordinator. Након додавања, презентер почиње да прима обавештења. Уклањање се врши преко removeFilePresenter. Систем чува слабу референцу на презентера, стога објекат мора бити жив током целог периода надгледања.
Према Apple WWDC 2022, NSFileCoordinator користи механизам координације на нивоу кернела, што обезбеђује минимално кашњење при блокирању. У најновијим верзијама iOS-а, координатор је оптимизован за рад са Sandbox и проширењима апликација.
Intention — свака операција читања или уписа мора бити умотана у блок координације: читање преко coordinateReadingItemAtURL, упис преко coordinateWritingItemAtURL. Координатор аутоматски блокира датотеку за друге учеснике током извршења блока.
Координација у групи — за операције са више датотека користи се групна координација. Координатор атомично блокира све наведене датотеке, извршава операцију и уклања блокаде. Ово је критично важно при премештању или копирању сетова докумената.
Направићемо класу DocumentPresenter која имплементира протокол NSFilePresenter и надгледа промене датотеке документа. Класа садржи референцу на датотеку, унутрашње податке и заставицу ажурности.
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) {
// Обрада података документа
}
}
Класа имплементира presentedItemDidChange за поновно учитавање података при промени датотеке и accommodatePresentedItemDeletion за чување стања пре брисања. Оперативни ред гарантује да се сва обавештења обрађују секвенцијално.
Регистрација презентера врши се преко NSFileCoordinator.addFilePresenter при отварању документа. Важно је проследити координатору исправне опције читања — withoutChanges за операције без измене или immediatelyAvailable за сценарије са тренутним приступом.
Прва честа грешка — недостатак имплементације presentedItemOperationQueue. Ако не наведете ред, обавештења могу стизати у произвољној нити, изазивајући трку података. Увек користите секвенцијални OperationQueue за обраду обавештења.
Друга грешка — блокирање у методама презентера. Методе протокола се позивају синхроно из координатора. Ако презентер извршава дуготрајну операцију (упис у базу, мрежни захтев), блокира координатора за све остале учеснике. Пребаците тешке операције у позадинске редове.
Трећа грешка — игнорисање accommodatePresentedItemDeletion. Ако презентер не имплементира ову методу и не враћа грешку, датотека може бити обрисана без чувања тренутног стања. Увек чувајте податке у овој методи ако још нису уписани на диск.
Четврта грешка — циклична координација. Када презентер унутар методе обавештења поново позове координатора за исту датотеку, настаје deadlock. Проверите заставицу isCoordinatedOperation пре покретања координације унутар handler-а.
| Грешка | Последица | Решење |
|---|---|---|
| Нема реда операција | Трка података у вишенитности | Навести OperationQueue |
| Блокирање у методама | Зависање координатора | Пребацити у позадинску нит |
| Игнорисање deletion | Губитак података при брисању | Имплементирати чување |
| Циклична координација | Deadlock апликације | Заставица isCoordinatedOperation |
Често постављана питања
NSFileHandle — ово је нискоризиони интерфејс за читање и упис података који не пружа механизме обавештавања о променама из других процеса. NSFilePresenter ради на нивоу координације: прима догађаје од система при свакој промени датотеке, без обзира на извор — друга нит, процес или iCloud.
Да. NSFilePresenter нема смисла без NSFileCoordinator. Презентер само дефинише методе обраде, а координатор управља блокирањем и позива ове методе. Ако користите NSFilePresenter без координатора, обавештења неће бити достављена.
Може, али са ограничењима. Својство presentedItemURL враћа само један URL, стога се за надгледање више датотека користи протокол NSFilePresenter са додатним методама за поделементе. Алтернатива — креирање засебне инстанце презентера за сваку датотеку.
NSFilePresenter је потпуно компатибилан са пешчаником iOS-а. Апликација може да надгледа датотеке само унутар свог контејнера. За приступ датотекама других апликација користе се App Groups или Security-Scoped Bookmark. Координатор ради у оквиру дозвола пешчаника.
Користите debounce или throttle унутар методе presentedItemDidChange. Направите тајмер са кашњењем од 0,3-0,5 секунди и ресетујте га при сваком новом позиву. Након стабилизације, извршите поновно учитавање података. Ово спречава вишеструку обраду истог пакета промена.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође