NSFilePresenter: apa itu, protokol NSFileCoordinator dan metode pelacakan

Penulis: IT Sectr Diterbitkan: 2026-07-12 Waktu membaca: 7 mnt

NSFilePresenter — adalah protokol Foundation yang memungkinkan objek menerima pemberitahuan tentang perubahan file dan direktori di sistem file iOS dan macOS. Kelas mengimplementasikan metode protokol dan mendaftar melalui NSFileCoordinator, setelah itu sistem secara otomatis memanggil metode ini pada setiap operasi dengan file yang dilacak. Menurut Apple Developer Documentation (2025), NSFilePresenter digunakan dalam aplikasi dengan akses multi-thread ke dokumen untuk mencegah konflik penulisan. Protokol wajib digunakan bersama NSFileCoordinator — hanya dengan cara ini koordinasi akses yang aman terjamin.

Poin Penting

  • NSFilePresenter — protokol Foundation untuk melacak perubahan file dan direktori di iOS dan macOS.
  • NSFileCoordinator — kelas pasangan wajib yang mengelola akses dan memanggil metode delegasi.
  • accommodatePresentedItemDeletion — metode untuk menangani penghapusan file yang dilacak dengan kemungkinan pembatalan.
  • presentedItemDidChange — dipanggil pada setiap perubahan konten file atau direktori.
  • presentedItemURL — properti wajib yang mengembalikan URL file yang dilacak.

Apa itu NSFilePresenter?

NSFilePresenter — adalah protokol Foundation yang dirancang untuk melacak perubahan file dan direktori di sistem operasi Apple. Protokol mendefinisikan serangkaian metode yang diimplementasikan oleh objek pengamat untuk menerima pemberitahuan tentang peristiwa sistem file.

Tugas utama protokol adalah memastikan akses aman ke file dalam skenario multi-thread. Di iOS dan macOS, beberapa proses dan thread dapat mengakses file yang sama secara bersamaan melalui NSFileCoordinator, dan NSFilePresenter menjamin bahwa setiap peserta menerima status data terbaru.

Protokol ini disertakan dalam Foundation sejak iOS 5.0 dan macOS 10.7. Ini digunakan dalam aplikasi yang bekerja dengan dokumen, basis data, dan file apa pun yang dapat diubah secara bersamaan dari sumber berbeda — misalnya, saat sinkronisasi melalui iCloud atau pengeditan bersama.

Di mana NSFilePresenter Digunakan

Aplikasi Berorientasi Dokumen — area penggunaan utama NSFilePresenter. Aplikasi yang bekerja dengan UIDocument atau NSDocument secara otomatis mendaftarkan diri sebagai presenter melalui NSFileCoordinator. Ini memungkinkan penanganan konflik dengan benar saat mengedit file yang sama dari beberapa jendela atau perangkat.

Sinkronisasi iCloud — skenario kunci kedua. Ketika file berubah di satu perangkat, iCloud menyinkronkannya di semua perangkat yang terhubung. NSFilePresenter memberi tahu aplikasi tentang perubahan ini, memungkinkan pembaruan antarmuka tepat waktu.

Editor Multi-Thread — skenario ketiga. Dalam aplikasi di mana antrian latar memuat dan menyimpan data bersamaan dengan pekerjaan pengguna, NSFilePresenter mencegah kondisi balapan saat menulis dan membaca file.

Bagaimana NSFilePresenter Bekerja?

Mekanisme Kerja NSFilePresenter didasarkan pada model delegasi: objek mengimplementasikan metode protokol, mendaftar melalui NSFileCoordinator dan menerima panggilan pada setiap perubahan file yang dilacak. Sistem sendiri menentukan kapan perubahan terjadi dan metode mana yang harus dipanggil.

Proses dimulai dengan objek membuat instance NSFileCoordinator dan memanggil metode koordinator dengan melewatkan URL file. Koordinator memeriksa apakah ada presenter yang terdaftar untuk URL ini. Jika ya, ia memblokir akses baca atau tulis dan memberi tahu presenter tentang perubahan yang akan datang melalui metode protokol.

Setelah operasi selesai, koordinator melepaskan kunci dan memanggil pemberitahuan akhir. Penting bahwa presenter tidak mengelola alur eksekusi — ia hanya bereaksi terhadap peristiwa. Koordinasi sepenuhnya menjadi tanggung jawab NSFileCoordinator.

Siklus Hidup Pemberitahuan

Fase Persiapan — sebelum menjalankan operasi, koordinator memanggil metode accommodatePresentedItemDeletion atau accommodatePresentedSubitemDeletion. Presenter dapat menangani situasi atau membatalkan operasi dengan mengembalikan kesalahan. Fase ini memungkinkan aplikasi menyelesaikan pekerjaan dengan file dengan benar sebelum perubahannya.

Fase Pemberitahuan — setelah operasi selesai, koordinator memanggil presentedItemDidChange atau presentedSubitemDidChange. Presenter menerima sinyal bahwa file telah berubah dan dapat membaca ulang kontennya. Untuk pemindahan file, presentedItemDidMoveToURL dipanggil dengan lokasi baru.

Fase Penyelesaian — koordinator melepaskan semua kunci dan membebaskan sumber daya. Presenter dapat melanjutkan pekerjaan dengan data yang diperbarui. Ketiga fase dieksekusi secara sinkron dalam thread yang sama, oleh karena itu metode protokol harus bekerja cepat, tanpa operasi input-output yang lama.

Metode Utama Protokol

Protokol NSFilePresenter berisi beberapa metode wajib dan opsional. Satu-satunya properti wajib adalah presentedItemURL, yang mengembalikan URL file atau direktori yang dilacak. Tanpa properti ini, objek tidak dapat didaftarkan sebagai presenter.

Metode Wajib

presentedItemURL — properti bertipe URL? yang harus mengembalikan jalur ke file yang dilacak. Jika objek melacak banyak file, properti mengembalikan URL elemen utama. Untuk direktori, URL direktori itu sendiri dikembalikan.

presentedItemDidChange — dipanggil setelah perubahan konten file yang dilacak. Dalam metode ini, presenter memperbarui status internal dan memuat ulang data. Metode ini tidak menerima informasi tentang apa yang sebenarnya berubah — hanya fakta perubahan.

Metode Opsional

accommodatePresentedItemDeletion — dipanggil sebelum penghapusan file. Presenter dapat menyimpan status saat ini, menutup deskriptor file, atau membatalkan operasi dengan mengembalikan NSError. Jika metode mengembalikan kesalahan, operasi penghapusan tidak dilakukan.

presentedItemDidMoveToURL — dipanggil setelah pemindahan atau penggantian nama file. Metode menerima URL baru, dan presenter harus memperbarui referensi ke file. Tanpa implementasi metode ini, presenter akan terus menunjuk ke jalur lama yang tidak ada.

NSFilePresenter dan NSFileCoordinator

NSFileCoordinator dan NSFilePresenter — pasangan yang tidak terpisahkan. NSFileCoordinator mengelola akses ke file dan memanggil metode presenter. Presenter tidak bekerja langsung dengan sistem file — semua operasi melalui koordinator yang menjamin atomicitas perubahan.

Koordinator mendaftarkan presenter melalui metode addFilePresenter dari kelas NSFileCoordinator. Setelah ditambahkan, presenter mulai menerima pemberitahuan. Penghapusan dilakukan melalui removeFilePresenter. Sistem menyimpan referensi lemah ke presenter, oleh karena itu objek harus tetap hidup selama periode pelacakan.

Menurut Apple WWDC 2022, NSFileCoordinator menggunakan mekanisme koordinasi di tingkat kernel, yang memastikan latensi minimal saat penguncian. Dalam versi terbaru iOS, koordinator dioptimalkan untuk bekerja dengan Sandbox dan ekstensi aplikasi.

Aturan Koordinasi

Intention — setiap operasi baca atau tulis harus dibungkus dalam blok koordinasi: baca melalui coordinateReadingItemAtURL, tulis melalui coordinateWritingItemAtURL. Koordinator secara otomatis mengunci file untuk peserta lain selama eksekusi blok.

Koordinasi Batch — untuk operasi dengan banyak file, digunakan koordinasi batch. Koordinator secara atomik mengunci semua file yang ditentukan, menjalankan operasi, dan melepaskan kunci. Ini sangat penting saat memindahkan atau menyalin set dokumen.

Contoh Implementasi NSFilePresenter

Mari buat kelas DocumentPresenter yang mengimplementasikan protokol NSFilePresenter dan melacak perubahan file dokumen. Kelas berisi referensi ke file, data internal, dan flag aktualitas.

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) {
        // Pemrosesan data dokumen
    }
}

Kelas mengimplementasikan presentedItemDidChange untuk memuat ulang data saat file berubah dan accommodatePresentedItemDeletion untuk menyimpan status sebelum penghapusan. Antrian operasi menjamin bahwa semua pemberitahuan diproses secara berurutan.

Pendaftaran presenter dilakukan melalui NSFileCoordinator.addFilePresenter saat membuka dokumen. Penting untuk memberikan opsi baca yang benar ke koordinator — withoutChanges untuk operasi tanpa modifikasi atau immediatelyAvailable untuk skenario dengan akses segera.

Kesalahan Umum dalam Bekerja

Kesalahan umum pertama — kurangnya implementasi presentedItemOperationQueue. Jika Anda tidak menentukan antrian, pemberitahuan dapat datang di thread sembarang, menyebabkan perlombaan data. Selalu gunakan OperationQueue sekuensial untuk memproses pemberitahuan.

Kesalahan kedua — memblokir dalam metode presenter. Metode protokol dipanggil secara sinkron dari koordinator. Jika presenter melakukan operasi panjang (menulis ke database, permintaan jaringan), ia memblokir koordinator untuk semua peserta lain. Pindahkan operasi berat ke antrian latar.

Kesalahan ketiga — mengabaikan accommodatePresentedItemDeletion. Jika presenter tidak mengimplementasikan metode ini dan tidak mengembalikan kesalahan, file dapat dihapus tanpa menyimpan status saat ini. Selalu simpan data dalam metode ini jika belum ditulis ke disk.

Kesalahan keempat — koordinasi siklik. Ketika presenter di dalam metode pemberitahuan memanggil koordinator lagi untuk file yang sama, terjadi deadlock. Periksa flag isCoordinatedOperation sebelum memulai koordinasi di dalam handler.

KesalahanKonsekuensiSolusi
Tidak ada antrian operasiPerlombaan data dalam multi-threadTentukan OperationQueue
Memblokir dalam metodeKoordinator menggantungPindahkan ke thread latar
Mengabaikan deletionKehilangan data saat penghapusanImplementasikan penyimpanan
Koordinasi siklikDeadlock aplikasiFlag isCoordinatedOperation

Pertanyaan yang Sering Diajukan

Mengapa NSFilePresenter diperlukan jika ada NSFileHandle?

NSFileHandle — adalah antarmuka tingkat rendah untuk membaca dan menulis data yang tidak menyediakan mekanisme pemberitahuan perubahan dari proses lain. NSFilePresenter bekerja pada tingkat koordinasi: ia menerima peristiwa dari sistem pada setiap perubahan file, terlepas dari sumbernya — thread lain, proses, atau iCloud.

Apakah wajib menggunakan NSFileCoordinator dengan NSFilePresenter?

Ya. NSFilePresenter tidak berguna tanpa NSFileCoordinator. Presenter hanya mendefinisikan metode penanganan, sementara koordinator mengelola kunci dan memanggil metode ini. Jika Anda menggunakan NSFilePresenter tanpa koordinator, pemberitahuan tidak akan dikirimkan.

Bisakah satu objek menjadi presenter untuk banyak file?

Bisa, tetapi dengan keterbatasan. Properti presentedItemURL hanya mengembalikan satu URL, oleh karena itu untuk melacak banyak file digunakan protokol NSFilePresenter dengan metode tambahan untuk sub-elemen. Alternatif — membuat instance presenter terpisah untuk setiap file.

Bagaimana NSFilePresenter bekerja dengan Sandbox di iOS?

NSFilePresenter sepenuhnya kompatibel dengan sandbox iOS. Aplikasi hanya dapat melacak file di dalam containernya sendiri. Untuk akses ke file aplikasi lain, digunakan App Groups atau Security-Scoped Bookmark. Koordinator bekerja dalam batas izin sandbox.

Apa yang harus dilakukan jika presentedItemDidChange dipanggil terlalu sering?

Gunakan debounce atau throttle di dalam metode presentedItemDidChange. Buat timer dengan penundaan 0,3-0,5 detik dan reset pada setiap panggilan baru. Setelah stabil, lakukan pemuatan ulang data. Ini mencegah pemrosesan berulang dari paket perubahan yang sama.

Kesimpulan

  • NSFilePresenter — protokol Foundation untuk menerima pemberitahuan perubahan file di iOS dan macOS, bekerja secara eksklusif bersama NSFileCoordinator.
  • Properti wajib presentedItemURL — tanpanya objek tidak dapat didaftarkan sebagai presenter dan tidak akan menerima pemberitahuan.
  • Metode utama presentedItemDidChange dipanggil setelah setiap perubahan konten file — gunakan untuk memuat ulang data.
  • accommodatePresentedItemDeletion memungkinkan penanganan penghapusan file dengan benar dan menyimpan status aplikasi saat ini.
  • NSFileCoordinator mengelola kunci dan menjamin atomicitas operasi — tanpa koordinator, presenter tidak berguna.
  • Kesalahan umum termasuk tidak adanya antrian operasi, memblokir dalam metode, dan koordinasi siklik — penting untuk menghindarinya melalui perancangan.
  • Debounce presentedItemDidChange pada panggilan sering — gunakan timer untuk mengelompokkan perubahan sebelum memuat ulang.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga