NSFilePresenter: nedir, NSFileCoordinator protokolü ve izleme yöntemleri

Yazar: IT Sectr Yayınlanma: 2026-07-12 Okuma süresi: 7 dk

NSFilePresenter, bir nesnenin iOS ve macOS dosya sistemindeki dosya ve dizin değişiklikleri hakkında bildirim almasını sağlayan bir Foundation protokolüdür. Sınıf, protokol yöntemlerini uygular ve NSFileCoordinator aracılığıyla kaydolur, ardından sistem, izlenen dosyayla ilgili herhangi bir işlem sırasında bu yöntemleri otomatik olarak çağırır. Apple Developer Documentation (2025)'ye göre NSFilePresenter, yazma çakışmalarını önlemek için çoklu iş parçacıklı belge erişimi olan uygulamalarda kullanılır. Protokol, NSFileCoordinator ile birlikte kullanılmalıdır — yalnızca bu şekilde güvenli erişim koordinasyonu sağlanır.

Anahtar noktalar

  • NSFilePresenter — iOS ve macOS'ta dosya ve dizin değişikliklerini izlemek için bir Foundation protokolü.
  • NSFileCoordinator — erişimi yöneten ve temsilci yöntemlerini çağıran zorunlu bir yardımcı sınıf.
  • accommodatePresentedItemDeletion — iptal yeteneği ile izlenen dosyanın silinmesini işlemek için bir yöntem.
  • presentedItemDidChange — bir dosya veya dizinin içeriği değiştiğinde çağrılır.
  • presentedItemURL — izlenen dosyanın URL'sini döndüren zorunlu bir özellik.

NSFilePresenter nedir?

NSFilePresenter, Apple işletim sistemlerinde dosya ve dizin değişikliklerini izlemek için tasarlanmış bir Foundation protokolüdür. Protokol, gözlemci nesnenin dosya sistemi olay bildirimlerini almak için uyguladığı bir dizi yöntem tanımlar.

Protokolün temel amacı, çoklu iş parçacıklı senaryolarda güvenli dosya erişimi sağlamaktır. iOS ve macOS'ta, birden çok işlem ve iş parçacığı NSFileCoordinator aracılığıyla aynı dosyaya aynı anda erişebilir ve NSFilePresenter, her katılımcının en güncel veri durumunu almasını sağlar.

Protokol, iOS 5.0 ve macOS 10.7'den beri Foundation'a dahildir. Belgeler, veritabanları ve farklı kaynaklardan aynı anda değiştirilebilen herhangi bir dosyayla çalışan uygulamalarda kullanılır — örneğin, iCloud senkronizasyonu veya işbirlikçi düzenleme sırasında.

NSFilePresenter nerelerde kullanılır

Belge tabanlı uygulamalar — NSFilePresenter'ın ana kullanım alanı. UIDocument veya NSDocument ile çalışan uygulamalar, NSFileCoordinator aracılığıyla otomatik olarak sunucu olarak kaydolur. Bu, aynı dosyayı birden çok pencereden veya cihazdan düzenlerken çakışmaların doğru şekilde işlenmesini sağlar.

iCloud senkronizasyonu — ikinci ana senaryo. Bir dosya bir cihazda değiştirildiğinde, iCloud bunu bağlı tüm cihazlarda senkronize eder. NSFilePresenter, uygulamayı bu değişiklikler hakkında bilgilendirerek zamanında arayüz güncellemelerine olanak tanır.

Çoklu iş parçacıklı düzenleyiciler — üçüncü senaryo. Arka plan kuyruklarının kullanıcı çalışmasıyla eş zamanlı olarak veri yüklediği ve kaydettiği uygulamalarda NSFilePresenter, dosya yazma ve okuma sırasında yarışma koşullarını önler.

NSFilePresenter nasıl çalışır?

Çalışma mekanizması NSFilePresenter, yetkilendirme modeline dayanır: nesne protokol yöntemlerini uygular, NSFileCoordinator aracılığıyla kaydolur ve izlenen dosya her değiştiğinde çağrılar alır. Sistem, bir değişikliğin ne zaman gerçekleştiğini ve hangi yöntemlerin çağrılacağını kendisi belirler.

Süreç, nesne bir NSFileCoordinator örneği oluşturduğunda ve dosya URL'sini ileterek koordinatörün yöntemini çağırdığında başlar. Koordinatör, bu URL için kayıtlı sunucu olup olmadığını kontrol eder. Varsa, okuma veya yazma erişimini engeller ve protokol yöntemleri aracılığıyla sunucuları yaklaşan değişiklik hakkında bilgilendirir.

İşlem tamamlandıktan sonra koordinatör kilidi serbest bırakır ve son bildirimleri çağırır. Önemli olan, sunucunun yürütme akışını kontrol etmemesidir — yalnızca olaylara tepki verir. NSFileCoordinator koordinasyondan tamamen sorumludur.

Bildirim yaşam döngüsü

Hazırlık aşaması — bir işlem yürütmeden önce, koordinatör accommodatePresentedItemDeletion veya accommodatePresentedSubitemDeletion'ı çağırır. Sunucu, durumu işleyebilir veya bir hata döndürerek işlemi iptal edebilir. Bu aşama, uygulamanın dosya değiştirilmeden önce dosyayla çalışmayı düzgün bir şekilde sonlandırmasına olanak tanır.

Bildirim aşaması — işlem tamamlandıktan sonra, koordinatör presentedItemDidChange veya presentedSubitemDidChange'i çağırır. Sunucu, dosyanın değiştiğine dair bir sinyal alır ve içeriğini yeniden okuyabilir. Dosya taşınması için, yeni konumla birlikte presentedItemDidMoveToURL çağrılır.

Tamamlama aşaması — koordinatör tüm kilitleri serbest bırakır ve kaynakları boşaltır. Sunucu, güncellenmiş verilerle çalışmaya devam edebilir. Her üç aşama da tek bir iş parçacığında eşzamanlı olarak yürütülür, bu nedenle protokol yöntemleri uzun G/Ç işlemleri olmadan hızlı bir şekilde yürütülmelidir.

Protokolün ana yöntemleri

NSFilePresenter protokolü, birkaç zorunlu ve isteğe bağlı yöntem içerir. Tek zorunlu özellik, izlenen dosya veya dizinin URL'sini döndüren presentedItemURL'dir. Bu özellik olmadan, nesne sunucu olarak kaydedilemez.

Zorunlu yöntemler

presentedItemURL — izlenen dosyanın yolunu döndürmesi gereken URL? türünde bir özellik. Nesne birden çok dosyayı izliyorsa, özellik ana öğenin URL'sini döndürür. Dizinler için, dizinin URL'sini döndürür.

presentedItemDidChange — izlenen dosyanın içeriği değiştikten sonra çağrılır. Bu yöntemde, sunucu iç durumunu günceller ve verileri yeniden yükler. Bu yöntem, tam olarak neyin değiştiği hakkında bilgi almaz — yalnızca değişiklik gerçeğini alır.

İsteğe bağlı yöntemler

accommodatePresentedItemDeletion — dosya silinmeden önce çağrılır. Sunucu, mevcut durumu kaydedebilir, dosya tanımlayıcılarını kapatabilir veya bir NSError döndürerek işlemi iptal edebilir. Yöntem bir hata döndürürse, silme işlemi gerçekleştirilmez.

presentedItemDidMoveToURL — dosya taşınması veya yeniden adlandırılmasından sonra çağrılır. Yöntem yeni URL'yi alır ve sunucunun dosya referansını güncellemesi gerekir. Bu yöntemi uygulamadan, sunucu var olmayan eski yolu göstermeye devam edecektir.

NSFilePresenter ve NSFileCoordinator

NSFileCoordinator ve NSFilePresenter ayrılmaz bir çifttir. NSFileCoordinator dosya erişimini yönetir ve sunucu yöntemlerini çağırır. Sunucu doğrudan dosya sistemiyle çalışmaz — tüm işlemler, değişikliklerin atomikliğini garanti eden koordinatör üzerinden gerçekleşir.

Koordinatör, NSFileCoordinator sınıfının addFilePresenter yöntemi aracılığıyla sunucuyu kaydeder. Kayıttan sonra sunucu bildirim almaya başlar. Kaldırma, removeFilePresenter aracılığıyla yapılır. Sistem, sunucuya zayıf bir referans tutar, bu nedenle nesne izleme süresi boyunca canlı kalmalıdır.

Apple WWDC 2022'ye göre NSFileCoordinator, kilitleme sırasında minimum gecikme sağlayan çekirdek düzeyinde bir koordinasyon mekanizması kullanır. En son iOS sürümlerinde koordinatör, Sandbox ve uygulama uzantılarıyla çalışmak için optimize edilmiştir.

Koordinasyon kuralları

Niyet — her okuma veya yazma işlemi bir koordinasyon bloğuna sarılmalıdır: coordinateReadingItemAtURL ile okuma, coordinateWritingItemAtURL ile yazma. Koordinatör, blok yürütme sırasında diğer katılımcılar için dosyayı otomatik olarak kilitler.

Toplu koordinasyon — birden çok dosya içeren işlemler için toplu koordinasyon kullanılır. Koordinatör, belirtilen tüm dosyaları atomik olarak kilitler, işlemi gerçekleştirir ve kilitleri serbest bırakır. Bu, belge kümelerini taşırken veya kopyalarken kritik öneme sahiptir.

Uygulama örneği

NSFilePresenter protokolünü uygulayan ve bir belge dosyasındaki değişiklikleri izleyen bir DocumentPresenter sınıfı oluşturalım. Sınıf, dosyaya bir referans, iç veriler ve bir geçerlilik işareti içerir.

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) {
        // Belge verisi işleme
    }
}

Sınıf, dosya değiştiğinde verileri yeniden yüklemek için presentedItemDidChange ve silme öncesinde durumu kaydetmek için accommodatePresentedItemDeletion uygular. İşlem kuyruğu, tüm bildirimlerin sırayla işlenmesini sağlar.

Sunucu kaydı, bir belge açılırken NSFileCoordinator.addFilePresenter aracılığıyla yapılır. Koordinatöre doğru okuma seçeneklerini iletmek önemlidir — değişiklik yapmayan işlemler için withoutChanges veya acil erişim gerektiren senaryolar için immediatelyAvailable.

Yaygın hatalar

İlk yaygın hata, presentedItemOperationQueue uygulamasının eksikliğidir. Bir kuyruk belirtmezseniz, bildirimler rastgele bir iş parçacığına gelebilir ve veri yarışmalarına neden olabilir. Bildirimleri işlemek için her zaman sıralı bir OperationQueue kullanın.

İkinci hata, sunucu yöntemlerinde engellemedir. Protokol yöntemleri, koordinatörden eşzamanlı olarak çağrılır. Sunucu uzun bir işlem (veritabanı yazma, ağ isteği) gerçekleştirirse, diğer tüm katılımcılar için koordinatörü engeller. Ağır işlemleri arka plan kuyruklarına taşıyın.

Üçüncü hata, accommodatePresentedItemDeletion'ı görmezden gelmektir. Sunucu bu yöntemi uygulamaz ve bir hata döndürmezse, dosya mevcut durumu kaydetmeden silinebilir. Henüz diske yazılmamışsa, bu yöntemde her zaman verileri kaydedin.

Dördüncü hata, döngüsel koordinasyondur. Sunucu, bir bildirim yöntemi içinde aynı dosya için koordinatörü tekrar çağırdığında, bir deadlock oluşur. Bir işleyici içinde koordinasyon başlatmadan önce isCoordinatedOperation işaretini kontrol edin.

HataSonuçÇözüm
İşlem kuyruğu yokÇoklu iş parçacığında veri yarışmasıOperationQueue belirtin
Yöntemlerde engellemeKoordinatör donmasıArka plan iş parçacığına taşıyın
Silme görmezden gelmeSilme sırasında veri kaybıKaydetmeyi uygulayın
Döngüsel koordinasyonUygulama deadlock'uisCoordinatedOperation işareti

Sıkça sorulan sorular

NSFileHandle varken neden NSFilePresenter'a ihtiyaç var?

NSFileHandle, diğer işlemlerden gelen değişiklikler için bildirim mekanizmaları sağlamayan, veri okuma ve yazma için düşük seviyeli bir arayüzdür. NSFilePresenter, koordinasyon düzeyinde çalışır: kaynağı — başka bir iş parçacığı, işlem veya iCloud — ne olursa olsun, dosya her değiştiğinde sistemden olaylar alır.

NSFilePresenter ile NSFileCoordinator kullanmak zorunlu mu?

Evet. NSFilePresenter, NSFileCoordinator olmadan bir anlam ifade etmez. Sunucu yalnızca işleyici yöntemlerini tanımlarken, koordinatör kilitleri yönetir ve bu yöntemleri çağırır. NSFilePresenter'ı koordinatör olmadan kullanırsanız, bildirimler iletilmez.

Tek bir nesne birden çok dosya için sunucu olabilir mi?

Olabilir, ancak sınırlamalarla. presentedItemURL özelliği yalnızca bir URL döndürür, bu nedenle birden çok dosyayı izlemek için alt öğeler için ek yöntemlerle NSFilePresenter protokolü kullanılır. Bir alternatif, her dosya için ayrı bir sunucu örneği oluşturmaktır.

NSFilePresenter iOS'ta Sandbox ile nasıl çalışır?

NSFilePresenter, iOS kum havuzuyla tamamen uyumludur. Uygulama yalnızca kendi kapsayıcısı içindeki dosyaları izleyebilir. Diğer uygulamaların dosyalarına erişmek için App Groups veya Security-Scoped Bookmarks kullanılır. Koordinatör, kum havuzu izinleri dahilinde çalışır.

presentedItemDidChange çok sık çağrılırsa ne yapmalı?

presentedItemDidChange yöntemi içinde debounce veya throttle kullanın. 0,3–0,5 saniye gecikmeli bir zamanlayıcı oluşturun ve her yeni çağrıda sıfırlayın. Stabilizasyondan sonra veri yeniden yüklemesi gerçekleştirin. Bu, tek bir değişiklik topluluğunun birden çok kez işlenmesini önler.

Özet

  • NSFilePresenter — iOS ve macOS'ta dosya değişiklik bildirimleri almak için, yalnızca NSFileCoordinator ile birlikte çalışan bir Foundation protokolü.
  • Zorunlu özellik presentedItemURL — bu olmadan, nesne sunucu olarak kaydedilemez ve bildirim alamaz.
  • Ana yöntem presentedItemDidChange, dosya içeriğindeki herhangi bir değişiklikten sonra çağrılır — verileri yeniden yüklemek için kullanın.
  • accommodatePresentedItemDeletion, dosya silme işlemini doğru şekilde işlemeye ve mevcut uygulama durumunu kaydetmeye olanak tanır.
  • NSFileCoordinator kilitleri yönetir ve işlemlerin atomikliğini garanti eder — koordinatör olmadan sunucu işe yaramaz.
  • Yaygın hatalar arasında işlem kuyruğu eksikliği, yöntemlerde engelleme ve döngüsel koordinasyon bulunur — bunlar uygun tasarımla önlenmelidir.
  • Sık çağrılarda presentedItemDidChange Debounce — yeniden yüklemeden önce değişiklikleri toplamak için bir zamanlayıcı kullanın.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun