NSFilePresenter — ay isang Foundation protocol na nagpapahintulot sa isang bagay na makatanggap ng mga abiso tungkol sa mga pagbabago ng mga file at direktoryo sa file system ng iOS at macOS. Ang klase ay nagpapatupad ng mga pamamaraan ng protocol at nagrerehistro sa pamamagitan ng NSFileCoordinator, pagkatapos ay awtomatikong tinatawag ng system ang mga pamamaraang ito sa bawat operasyon na may sinusubaybayang file. Ayon sa Apple Developer Documentation (2025), ang NSFilePresenter ay ginagamit sa mga application na may multi-thread na access sa mga dokumento upang maiwasan ang mga salungatan sa pagsulat. Ang protocol ay kinakailangang gamitin kasama ng NSFileCoordinator — sa ganitong paraan lamang masisiguro ang ligtas na koordinasyon ng access.
Mga Pangunahing Puntos
NSFilePresenter — ay isang Foundation protocol na dinisenyo para sa pagsubaybay ng mga pagbabago ng mga file at direktoryo sa mga operating system ng Apple. Ang protocol ay tumutukoy sa isang hanay ng mga pamamaraan na ipinatutupad ng bagay na tagamasid upang makatanggap ng mga abiso tungkol sa mga kaganapan sa file system.
Ang pangunahing gawain ng protocol ay upang matiyak ang ligtas na access sa mga file sa multi-thread na mga senaryo. Sa iOS at macOS, maraming proseso at thread ang maaaring sabay na ma-access ang parehong file sa pamamagitan ng NSFileCoordinator, at ginagarantiyahan ng NSFilePresenter na ang bawat kalahok ay tumatanggap ng napapanahong estado ng datos.
Ang protocol ay kasama sa Foundation simula sa iOS 5.0 at macOS 10.7. Ito ay ginagamit sa mga application na nagtatrabaho sa mga dokumento, database at anumang mga file na maaaring sabay na baguhin mula sa iba't ibang mga mapagkukunan — halimbawa, sa panahon ng pag-sync sa pamamagitan ng iCloud o collaborative na pag-edit.
Mga Application na Nakatuon sa Dokumento — pangunahing lugar ng paggamit ng NSFilePresenter. Ang mga application na nagtatrabaho sa UIDocument o NSDocument ay awtomatikong nagrerehistro bilang mga presenter sa pamamagitan ng NSFileCoordinator. Ito ay nagpapahintulot ng tamang paghawak ng mga salungatan kapag nag-e-edit ng parehong file mula sa maraming window o device.
Pag-sync ng iCloud — pangalawang pangunahing senaryo. Kapag nagbago ang isang file sa isang device, ini-sync ito ng iCloud sa lahat ng konektadong device. Ang NSFilePresenter ay nag-aabiso sa application tungkol sa mga pagbabagong ito, na nagpapahintulot ng napapanahong pag-update ng interface.
Multi-Thread na Editor — pangatlong senaryo. Sa mga application kung saan ang mga background queue ay naglo-load at nagse-save ng datos kasabay ng trabaho ng user, pinipigilan ng NSFilePresenter ang kondisyon ng lahi sa pagsulat at pagbasa ng mga file.
Mekanismo ng Paggawa NSFilePresenter ay batay sa modelo ng delegasyon: ang bagay ay nagpapatupad ng mga pamamaraan ng protocol, nagrerehistro sa pamamagitan ng NSFileCoordinator at tumatanggap ng mga tawag sa bawat pagbabago ng sinusubaybayang file. Ang system mismo ang nagtatakda kung kailan naganap ang pagbabago at kung aling mga pamamaraan ang dapat tawagan.
Ang proseso ay nagsisimula sa bagay na lumilikha ng isang instance ng NSFileCoordinator at tumatawag sa pamamaraan ng coordinator na nagpapasa ng URL ng file. Sinusuri ng coordinator kung mayroong mga rehistradong presenter para sa URL na ito. Kung mayroon, hinaharangan nito ang access sa pagbasa o pagsulat at inaabisuhan ang mga presenter tungkol sa paparating na pagbabago sa pamamagitan ng mga pamamaraan ng protocol.
Pagkatapos ng operasyon, inaalis ng coordinator ang lock at tinatawag ang mga huling abiso. Mahalaga na ang presenter ay hindi namamahala ng daloy ng pagpapatupad — ito ay tumutugon lamang sa mga kaganapan. Ang koordinasyon ay ganap na responsibilidad ng NSFileCoordinator.
Yugto ng Paghahanda — bago isagawa ang operasyon, tinatawag ng coordinator ang pamamaraan na accommodatePresentedItemDeletion o accommodatePresentedSubitemDeletion. Maaaring hawakan ng presenter ang sitwasyon o kanselahin ang operasyon sa pamamagitan ng pagbabalik ng error. Ang yugtong ito ay nagpapahintulot sa application na matapos nang maayos ang trabaho sa file bago ito baguhin.
Yugto ng Abiso — pagkatapos ng operasyon, tinatawag ng coordinator ang presentedItemDidChange o presentedSubitemDidChange. Ang presenter ay tumatanggap ng senyales na ang file ay nagbago at maaaring muling basahin ang nilalaman nito. Para sa paglipat ng file, tinatawag ang presentedItemDidMoveToURL na may bagong lokasyon.
Yugto ng Pagtatapos — inaalis ng coordinator ang lahat ng lock at nagpapalaya ng mga mapagkukunan. Maaaring ipagpatuloy ng presenter ang trabaho sa mga na-update na datos. Lahat ng tatlong yugto ay isinasagawa nang sabay-sabay sa parehong thread, kaya ang mga pamamaraan ng protocol ay dapat gumana nang mabilis, walang mahabang input-output na operasyon.
Ang protocol na NSFilePresenter ay naglalaman ng ilang sapilitan at opsyonal na pamamaraan. Ang tanging sapilitang pag-aari ay presentedItemURL, na nagbabalik ng URL ng sinusubaybayang file o direktoryo. Kung wala ang pag-aari na ito, ang bagay ay hindi maaaring magrehistro bilang presenter.
presentedItemURL — pag-aari ng uri URL? na dapat magbalik ng landas sa sinusubaybayang file. Kung ang bagay ay sumusubaybay ng maraming file, ang pag-aari ay nagbabalik ng URL ng pangunahing elemento. Para sa mga direktoryo, ang URL ng direktoryo mismo ay ibinabalik.
presentedItemDidChange — tinatawag pagkatapos ng pagbabago ng nilalaman ng sinusubaybayang file. Sa pamamaraang ito, ina-update ng presenter ang kanyang panloob na estado at ni-reload ang datos. Ang pamamaraang ito ay hindi tumatanggap ng impormasyon kung ano ang eksaktong nagbago — tanging ang katotohanan ng pagbabago.
accommodatePresentedItemDeletion — tinatawag bago ang pagtanggal ng file. Maaaring i-save ng presenter ang kasalukuyang estado, isara ang mga deskriptor ng file, o kanselahin ang operasyon sa pamamagitan ng pagbabalik ng NSError. Kung ang pamamaraan ay nagbabalik ng error, ang operasyon ng pagtanggal ay hindi isasagawa.
presentedItemDidMoveToURL — tinatawag pagkatapos ng paglipat o pagpapalit ng pangalan ng file. Ang pamamaraan ay tumatanggap ng bagong URL, at dapat i-update ng presenter ang referensya sa file. Kung walang implementasyon ng pamamaraang ito, ang presenter ay patuloy na tuturo sa luma, hindi umiiral na landas.
NSFileCoordinator at NSFilePresenter — hindi mapaghihiwalay na pares. Ang NSFileCoordinator ay namamahala ng access sa mga file at tumatawag sa mga pamamaraan ng presenter. Ang presenter ay hindi direktang gumagana sa file system — lahat ng operasyon ay dumadaan sa coordinator na ginagarantiyahan ang atomicidad ng mga pagbabago.
Ang coordinator ay nagrerehistro ng presenter sa pamamagitan ng pamamaraang addFilePresenter ng klase NSFileCoordinator. Pagkatapos idagdag, ang presenter ay magsisimulang makatanggap ng mga abiso. Ang pag-alis ay ginagawa sa pamamagitan ng removeFilePresenter. Ang system ay nag-iingat ng mahinang referensya sa presenter, kaya ang bagay ay dapat manatiling buhay sa buong panahon ng pagsubaybay.
Ayon sa Apple WWDC 2022, ang NSFileCoordinator ay gumagamit ng mekanismo ng koordinasyon sa antas ng kernel, na nagsisiguro ng minimal na latency sa mga lock. Sa mga pinakabagong bersyon ng iOS, ang coordinator ay na-optimize para sa trabaho sa Sandbox at mga extension ng application.
Intention — bawat operasyon ng pagbasa o pagsulat ay dapat balot sa isang bloke ng koordinasyon: pagbasa sa pamamagitan ng coordinateReadingItemAtURL, pagsulat sa pamamagitan ng coordinateWritingItemAtURL. Awtomatikong ni-lock ng coordinator ang file para sa ibang mga kalahok sa panahon ng pagpapatupad ng bloke.
Batch koordinasyon — para sa mga operasyon na may maraming file, ginagamit ang batch na koordinasyon. Atomikong ni-lock ng coordinator ang lahat ng tinukoy na file, isinasagawa ang operasyon at inaalis ang mga lock. Ito ay kritikal na mahalaga sa paglipat o pagkopya ng mga set ng dokumento.
Gumawa tayo ng klase na DocumentPresenter na nagpapatupad ng NSFilePresenter protocol at sumusubaybay sa mga pagbabago ng file ng dokumento. Ang klase ay naglalaman ng referensya sa file, panloob na datos at flag ng aktuwalidad.
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) {
// Pagproseso ng datos ng dokumento
}
}
Ang klase ay nagpapatupad ng presentedItemDidChange para sa pag-reload ng datos kapag nagbago ang file at accommodatePresentedItemDeletion para sa pag-save ng estado bago ang pagtanggal. Ginagarantiyahan ng pila ng operasyon na ang lahat ng abiso ay pinoproseso nang sunud-sunod.
Ang pagrerehistro ng presenter ay ginagawa sa pamamagitan ng NSFileCoordinator.addFilePresenter kapag binubuksan ang dokumento. Mahalagang ibigay ang tamang mga opsyon sa pagbasa sa coordinator — withoutChanges para sa mga operasyon na walang pagbabago o immediatelyAvailable para sa mga senaryo na may agarang access.
Ang unang karaniwang pagkakamali — kawalan ng implementasyon ng presentedItemOperationQueue. Kung hindi ka magtukoy ng pila, ang mga abiso ay maaaring dumating sa anumang thread, na nagdudulot ng lahi ng datos. Palaging gumamit ng sunud-sunod na OperationQueue para sa pagproseso ng mga abiso.
Ang pangalawang pagkakamali — pag-block sa mga pamamaraan ng presenter. Ang mga pamamaraan ng protocol ay tinatawag nang sabay-sabay mula sa coordinator. Kung ang presenter ay nagsasagawa ng mahabang operasyon (pagsulat sa database, network request), hinaharangan nito ang coordinator para sa lahat ng ibang kalahok. Ilipat ang mabibigat na operasyon sa mga background queue.
Ang pangatlong pagkakamali — pagbalewala sa accommodatePresentedItemDeletion. Kung hindi ipinatupad ng presenter ang pamamaraang ito at hindi nagbabalik ng error, ang file ay maaaring matanggal nang hindi nai-save ang kasalukuyang estado. Palaging i-save ang datos sa pamamaraang ito kung hindi pa ito naisulat sa disk.
Ang pang-apat na pagkakamali — siklikal na koordinasyon. Kapag ang presenter sa loob ng pamamaraan ng abiso ay tumawag muli sa coordinator para sa parehong file, nagkakaroon ng deadlock. Suriin ang flag na isCoordinatedOperation bago simulan ang koordinasyon sa loob ng handler.
| Pagkakamali | Bunga | Solusyon |
|---|---|---|
| Walang pila ng operasyon | Lahi ng datos sa multi-threading | Tukuyin ang OperationQueue |
| Pag-block sa mga pamamaraan | Pagbitin ng coordinator | Ilipat sa background thread |
| Pagbalewala sa deletion | Pagkawala ng datos sa pagtanggal | Ipatupad ang pag-save |
| Siklikal na koordinasyon | Deadlock ng application | Flag na isCoordinatedOperation |
Mga Madalas Itanong
NSFileHandle — ay isang mababang antas na interface para sa pagbasa at pagsulat ng datos na hindi nagbibigay ng mga mekanismo ng abiso tungkol sa mga pagbabago mula sa ibang mga proseso. Ang NSFilePresenter ay gumagana sa antas ng koordinasyon: ito ay tumatanggap ng mga kaganapan mula sa system sa bawat pagbabago ng file, anuman ang pinagmulan — ibang thread, proseso o iCloud.
Oo. Ang NSFilePresenter ay walang saysay kung wala ang NSFileCoordinator. Ang presenter ay tumutukoy lamang ng mga pamamaraan ng paghawak, habang ang coordinator ay namamahala ng mga lock at tumatawag sa mga pamamaraang ito. Kung gagamitin mo ang NSFilePresenter na walang coordinator, ang mga abiso ay hindi maihahatid.
Maaari, ngunit may mga limitasyon. Ang pag-aari na presentedItemURL ay nagbabalik lamang ng isang URL, kaya para sa pagsubaybay ng maraming file, ginagamit ang NSFilePresenter protocol na may karagdagang mga pamamaraan para sa mga sub-elemento. Alternatibo — paggawa ng hiwalay na instance ng presenter para sa bawat file.
NSFilePresenter ay ganap na katugma sa sandbox ng iOS. Ang application ay maaari lamang sumubaybay ng mga file sa loob ng sarili nitong container. Para sa access sa mga file ng ibang application, ginagamit ang App Groups o Security-Scoped Bookmark. Ang coordinator ay gumagana sa loob ng mga pahintulot ng sandbox.
Gumamit ng debounce o throttle sa loob ng pamamaraang presentedItemDidChange. Gumawa ng timer na may pagkaantala na 0.3-0.5 segundo at i-reset ito sa bawat bagong tawag. Pagkatapos ng pag-stabilize, isagawa ang pag-reload ng datos. Ito ay pumipigil sa paulit-ulit na pagproseso ng parehong pakete ng mga pagbabago.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din