NSFilePresenter: ano ito, protocol ng NSFileCoordinator at mga paraan ng pagsubaybay

May-akda: IT Sectr Nai-publish: 2026-07-12 Oras ng pagbabasa: 7 min

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 — Foundation protocol para sa pagsubaybay ng mga pagbabago ng file at direktoryo sa iOS at macOS.
  • NSFileCoordinator — sapilitang partner na klase na namamahala ng access at tumatawag sa mga pamamaraan ng delegado.
  • accommodatePresentedItemDeletion — pamamaraan para sa paghawak ng pagtanggal ng sinusubaybayang file na may posibilidad ng pagkansela.
  • presentedItemDidChange — tinatawag sa bawat pagbabago ng nilalaman ng file o direktoryo.
  • presentedItemURL — sapilitang pag-aari na nagbabalik ng URL ng sinusubaybayang file.

Ano ang NSFilePresenter?

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.

Saan Ginagamit ang NSFilePresenter

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.

Paano Gumagana ang NSFilePresenter?

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.

Siklo ng Buhay ng Abiso

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.

Mga Pangunahing Pamamaraan ng Protocol

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.

Sapilitang Pamamaraan

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.

Opsyonal na Pamamaraan

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.

NSFilePresenter at NSFileCoordinator

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.

Mga Patakaran ng Koordinasyon

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.

Halimbawa ng Implementasyon ng NSFilePresenter

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.

swift
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.

Mga Karaniwang Pagkakamali sa Trabaho

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.

PagkakamaliBungaSolusyon
Walang pila ng operasyonLahi ng datos sa multi-threadingTukuyin ang OperationQueue
Pag-block sa mga pamamaraanPagbitin ng coordinatorIlipat sa background thread
Pagbalewala sa deletionPagkawala ng datos sa pagtanggalIpatupad ang pag-save
Siklikal na koordinasyonDeadlock ng applicationFlag na isCoordinatedOperation

Mga Madalas Itanong

Bakit kailangan ang NSFilePresenter kung may NSFileHandle?

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.

Kailangan bang gamitin ang NSFileCoordinator kasama ang NSFilePresenter?

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 bang maging presenter ang isang bagay para sa maraming file?

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.

Paano gumagana ang NSFilePresenter sa Sandbox sa iOS?

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.

Ano ang gagawin kung ang presentedItemDidChange ay tinatawag nang madalas?

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

  • NSFilePresenter — Foundation protocol para sa pagtanggap ng mga abiso tungkol sa mga pagbabago ng file sa iOS at macOS, na gumagana lamang kasama ng NSFileCoordinator.
  • Sapilitang pag-aari presentedItemURL — kung wala ito, ang bagay ay hindi maaaring magrehistro bilang presenter at hindi makakatanggap ng mga abiso.
  • Pangunahing pamamaraan presentedItemDidChange ay tinatawag pagkatapos ng anumang pagbabago ng nilalaman ng file — gamitin ito para sa pag-reload ng datos.
  • accommodatePresentedItemDeletion ay nagpapahintulot ng tamang paghawak ng pagtanggal ng file at pag-save ng kasalukuyang estado ng application.
  • NSFileCoordinator ay namamahala ng mga lock at ginagarantiyahan ang atomicidad ng mga operasyon — walang coordinator, ang presenter ay walang silbi.
  • Mga karaniwang pagkakamali ay kinabibilangan ng kawalan ng pila ng operasyon, pag-block sa mga pamamaraan at siklikal na koordinasyon — mahalaga na iwasan ang mga ito sa pamamagitan ng disenyo.
  • Debounce presentedItemDidChange sa madalas na mga tawag — gumamit ng timer para sa paggrupo ng mga pagbabago bago mag-reload.

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.

Pag-usapan ang proyekto

Basahin din