NSFilePresenter: bu nədir, NSFileCoordinator protokolu və izləmə metodları

Müəllif: IT Sectr Dərc olunub: 2026-07-12 Oxuma vaxtı: 7 dəq

NSFilePresenter — bu, iOS və macOS fayl sistemində fayl və kataloqların dəyişməsi barədə obyektə bildiriş almağa imkan verən Foundation protokoludur. Sinif protokol metodlarını icra edir və NSFileCoordinator vasitəsilə qeydiyyatdan keçir, bundan sonra sistem izlənilən fayl ilə hər hansı əməliyyat zamanı bu metodları avtomatik çağırır. Apple Developer Documentation (2025) məlumatına görə, NSFilePresenter yazma konfliktlərinin qarşısını almaq üçün çoxiplikli girişə malik sənəd tətbiqlərində istifadə olunur. Protokol mütləq NSFileCoordinator ilə birlikdə istifadə olunur — yalnız bu şəkildə təhlükəsiz giriş koordinasiyası təmin edilir.

Əsas məqamlar

  • NSFilePresenter — iOS və macOS-da fayl və kataloq dəyişikliklərini izləmək üçün Foundation protokolu.
  • NSFileCoordinator — girişi idarə edən və deleqat metodlarını çağıran məcburi qoşma sinif.
  • accommodatePresentedItemDeletion — ləğvetmə imkanı ilə izlənilən faylın silinməsini emal etmək üçün metod.
  • presentedItemDidChange — fayl və ya kataloqun məzmunu dəyişdikdə çağırılır.
  • presentedItemURL — izlənilən faylın URL-ni qaytaran məcburi xüsusiyyət.

NSFilePresenter nədir?

NSFilePresenter — bu, Apple əməliyyat sistemlərində fayl və kataloqların dəyişməsini izləmək üçün nəzərdə tutulmuş Foundation protokoludur. Protokol, fayl sistemi hadisələri barədə bildiriş almaq üçün müşahidəçi obyektinin icra etdiyi metodlar toplusunu müəyyən edir.

Protokolun əsas vəzifəsi çoxiplikli ssenarilərdə fayllara təhlükəsiz girişi təmin etməkdir. iOS və macOS-da bir neçə proses və iplik eyni anda NSFileCoordinator vasitəsilə eyni fayla müraciət edə bilər və NSFilePresenter hər bir iştirakçının aktual məlumat vəziyyətini almasına zəmanət verir.

Protokol iOS 5.0 və macOS 10.7-dən etibarən Foundation-a daxildir. Sənədlər, verilənlər bazaları və müxtəlif mənbələrdən eyni anda dəyişdirilə bilən istənilən fayllarla işləyən tətbiqlərdə — məsələn, iCloud vasitəsilə sinxronizasiya və ya birgə redaktə zamanı istifadə olunur.

NSFilePresenter harada tətbiq olunur

Sənəd yönümlü tətbiqlər — NSFilePresenter-in əsas istifadə sahəsi. UIDocument və ya NSDocument ilə işləyən tətbiqlər avtomatik olaraq NSFileCoordinator vasitəsilə özlərini prezenter kimi qeydiyyatdan keçirirlər. Bu, bir faylın bir neçə pəncərə və ya cihazdan redaktəsi zamanı konfliktləri düzgün emal etməyə imkan verir.

iCloud sinxronizasiyası — ikinci əsas ssenari. Fayl bir cihazda dəyişdikdə, iCloud onu bütün qoşulmuş cihazlarda sinxronizasiya edir. NSFilePresenter tətbiqə bu dəyişikliklər barədə bildiriş verərək interfeysin vaxtında yenilənməsinə imkan yaradır.

Çoxiplikli redaktorlar — üçüncü ssenari. Fon növbələrinin istifadəçi işi ilə eyni anda məlumat yüklədiyi və saxladığı tətbiqlərdə NSFilePresenter faylların yazılması və oxunması zamanı yarış vəziyyətinin qarşısını alır.

NSFilePresenter necə işləyir?

İş mexanizmi NSFilePresenter deleqasiya modelinə əsaslanır: obyekt protokol metodlarını icra edir, NSFileCoordinator vasitəsilə qeydiyyatdan keçir və izlənilən fayl hər dəyişdikdə çağırışlar alır. Sistem özü dəyişikliyin nə vaxt baş verdiyini və hansı metodların çağırılmalı olduğunu müəyyən edir.

Proses obyektin NSFileCoordinator nümunəsi yaratması və faylın URL-ni ötürərək koordinator metodunu çağırması ilə başlayır. Koordinator bu URL üçün hər hansı prezenterin qeydiyyatdan keçib-keçmədiyini yoxlayır. Əgər varsa, oxuma və ya yazma girişini bloklayır və protokol metodları vasitəsilə prezenterlərə qarşıdakı dəyişiklik barədə bildiriş göndərir.

Əməliyyat başa çatdıqdan sonra koordinator bloklamanı ləğv edir və yekun bildirişləri çağırır. Prezenterin icra axınını idarə etməməsi vacibdir — o, yalnız hadisələrə reaksiya verir. Koordinasiyaya tam cavabdeh NSFileCoordinator dir.

Bildirişin həyat dövrü

Hazırlıq mərhələsi — əməliyyatı yerinə yetirməzdən əvvəl koordinator accommodatePresentedItemDeletion və ya accommodatePresentedSubitemDeletion metodunu çağırır. Prezenter vəziyyəti emal edə və ya səhv qaytararaq əməliyyatı ləğv edə bilər. Bu mərhələ tətbiqə fayl dəyişdirilməzdən əvvəl onunla işi düzgün başa çatdırmağa imkan verir.

Bildiriş mərhələsi — əməliyyat başa çatdıqdan sonra koordinator presentedItemDidChange və ya presentedSubitemDidChange çağırır. Prezenter faylın dəyişdiyi barədə siqnal alır və onun məzmununu yenidən oxuya bilər. Faylın köçürülməsi üçün presentedItemDidMoveToURL yeni yerləşmə ilə çağırılır.

Tamamlanma mərhələsi — koordinator bütün bloklamaları ləğv edir və resursları buraxır. Prezenter yenilənmiş məlumatlarla işi davam etdirə bilər. Hər üç mərhələ bir iplikdə sinxron şəkildə icra olunur, buna görə də protokol metodları uzun giriş-çıxış əməliyyatları olmadan sürətli işləməlidir.

Protokolun əsas metodları

NSFilePresenter protokolu bir neçə məcburi və isteğe bağlı metod ehtiva edir. Yeganə məcburi xüsusiyyət — izlənilən fayl və ya kataloqun URL-ni qaytaran presentedItemURL dir. Bu xüsusiyyət olmadan obyekt prezenter kimi qeydiyyatdan keçə bilməz.

Məcburi metodlar

presentedItemURL — izlənilən fayla yolu qaytarmalı olan URL? tipli xüsusiyyət. Əgər obyekt bir neçə faylı izləyirsə, xüsusiyyət əsas elementin URL-ni qaytarır. Kataloqlar üçün kataloqun özünün URL-i qaytarılır.

presentedItemDidChange — izlənilən faylın məzmunu dəyişdikdən sonra çağırılır. Bu metodda prezenter öz daxili vəziyyətini yeniləyir və məlumatları yenidən yükləyir. Bu metod nəyin dəyişdiyi barədə məlumat almır — yalnız dəyişmə faktını bildirir.

İsteğe bağlı metodlar

accommodatePresentedItemDeletion — fayl silinməzdən əvvəl çağırılır. Prezenter cari vəziyyəti saxlaya, fayl deskriptorlarını bağlaya və ya NSError qaytararaq əməliyyatı ləğv edə bilər. Metod səhv qaytararsa, silmə əməliyyatı yerinə yetirilmir.

presentedItemDidMoveToURL — fayl köçürüldükdən və ya adı dəyişdirildikdən sonra çağırılır. Metod yeni URL alır və prezenter fayla istinadı yeniləməlidir. Bu metod olmadan prezenter köhnə, mövcud olmayan yola istinad etməyə davam edəcək.

NSFilePresenter və NSFileCoordinator

NSFileCoordinatorNSFilePresenter — ayrılmaz cütlük. NSFileCoordinator fayllara girişi idarə edir və prezenter metodlarını çağırır. Prezenter birbaşa fayl sistemi ilə işləmir — bütün əməliyyatlar dəyişikliklərin atomarlığını təmin edən koordinator vasitəsilə aparılır.

Koordinator prezenteri NSFileCoordinator sinfinin addFilePresenter metodu vasitəsilə qeydiyyatdan keçirir. Əlavə edildikdən sonra prezenter bildirişlər almağa başlayır. Silinmə removeFilePresenter vasitəsilə həyata keçirilir. Sistem prezenterə zəif istinad saxlayır, buna görə də obyekt izləmə müddəti ərzində aktiv olmalıdır.

Apple WWDC 2022 məlumatına görə, NSFileCoordinator nüvə səviyyəsində koordinasiya mexanizmindən istifadə edir ki, bu da bloklamalarda minimum gecikmə təmin edir. iOS-un ən yeni versiyalarında koordinator Sandbox və tətbiq uzantıları ilə iş üçün optimallaşdırılıb.

Koordinasiya qaydaları

Intention — hər bir oxuma və ya yazma əməliyyatı koordinasiya blokuna bükülməlidir: oxuma coordinateReadingItemAtURL, yazma coordinateWritingItemAtURL vasitəsilə. Koordinator blokun icrası müddətində faylı digər iştirakçılar üçün avtomatik bloklayır.

Batch coordination — bir neçə fayl ilə əməliyyatlar üçün toplu koordinasiyadan istifadə olunur. Koordinator bütün göstərilən faylları atomik şəkildə bloklayır, əməliyyatı yerinə yetirir və bloklamaları ləğv edir. Bu, sənəd dəstlərinin köçürülməsi və ya surətinin çıxarılması zamanı kritik əhəmiyyət daşıyır.

NSFilePresenter-in tətbiq nümunəsi

DocumentPresenter sinfi yaradaq ki, NSFilePresenter protokolunu icra etsin və sənəd faylının dəyişikliklərini izləsin. Sinif fayla istinad, daxili məlumatlar və aktuallıq bayrağı ehtiva edir.

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) {
        // Sənəd məlumatlarının emalı
    }
}

Sinif fayl dəyişdikdə məlumatları yenidən yükləmək üçün presentedItemDidChange və silmədən əvvəl vəziyyəti saxlamaq üçün accommodatePresentedItemDeletion i icra edir. Əməliyyat növbəsi bütün bildirişlərin ardıcıl emal olunmasını təmin edir.

Prezenterin qeydiyyatı sənəd açılarkən NSFileCoordinator.addFilePresenter vasitəsilə aparılır. Koordinata düzgün oxuma seçimlərini ötürmək vacibdir — dəyişiklik olmadan əməliyyatlar üçün withoutChanges və ya dərhal giriş ssenariləri üçün immediatelyAvailable.

İş zamanı tipik səhvlər

Birinci yaygın səhv — presentedItemOperationQueue icrasının olmaması. Əgər növbə göstərilməzsə, bildirişlər istənilən iplikdə gələ bilər və məlumat yarışına səbəb ola bilər. Bildirişləri emal etmək üçün həmişə ardıcıl OperationQueue istifadə edin.

İkinci səhv — prezenter metodlarında bloklama. Protokol metodları koordinatordan sinxron çağırılır. Prezenter uzunmüddətli əməliyyat (verilənlər bazasına yazma, şəbəkə sorğusu) yerinə yetirirsə, o, koordinatoru bütün digər iştirakçılar üçün bloklayır. Ağır əməliyyatları fon növbələrinə köçürün.

Üçüncü səhv — accommodatePresentedItemDeletion ın göz ardı edilməsi. Prezenter bu metodu icra etməzsə və səhv qaytarmazsa, fayl cari vəziyyəti saxlamadan silinə bilər. Bu metodda həmişə məlumatları saxlayın, əgər onlar hələ diskə yazılmayıbsa.

Dördüncü səhv — tsiklik koordinasiya. Prezenter bildiriş metodu daxilində eyni fayl üçün yenidən koordinatoru çağırdıqda, deadlock yaranır. Handler daxilində koordinasiyaya başlamazdan əvvəl isCoordinatedOperation bayrağını yoxlayın.

SəhvNəticəHəll
Əməliyyat növbəsi yoxdurÇoxiplikdə məlumat yarışıOperationQueue təyin edin
Metodlarda bloklamaKoordinatorun donmasıFon ipliyinə köçürün
Deletion ın göz ardı edilməsiSilinmə zamanı məlumat itkisiSaxlamağı icra edin
Tsiklik koordinasiyaTətbiqin deadlock-uisCoordinatedOperation bayrağı

Tez-tez verilən suallar

NSFileHandle varsa, NSFilePresenter nə üçün lazımdır?

NSFileHandle — bu, digər proseslərdən dəyişikliklər barədə bildiriş mexanizmlərini təmin etməyən aşağısəviyyəli məlumat oxuma və yazma interfeysidir. NSFilePresenter koordinasiya səviyyəsində işləyir: faylın hər hansı dəyişməsində — başqa iplik, proses və ya iCloud olmasından asılı olmayaraq — sistemdən hadisələr alır.

NSFilePresenter ilə NSFileCoordinator istifadə etmək məcburidirmi?

Bəli. NSFilePresenter NSFileCoordinator olmadan mənasızdır. Prezenter yalnız emal metodlarını müəyyən edir, koordinator isə bloklamaları idarə edir və bu metodları çağırır. Əgər NSFilePresenter i koordinator olmadan istifadə edirsinizsə, bildirişlər çatdırılmayacaq.

Bir obyekt bir neçə fayl üçün prezenter ola bilərmi?

Ola bilər, lakin məhdudiyyətlərlə. presentedItemURL xüsusiyyəti yalnız bir URL qaytarır, buna görə bir neçə faylı izləmək üçün NSFilePresenter protokolu subelementlər üçün əlavə metodlarla istifadə olunur. Alternativ — hər fayl üçün ayrıca prezenter nümunəsi yaratmaqdır.

NSFilePresenter iOS-da Sandbox ilə necə işləyir?

NSFilePresenter iOS sandbox ilə tam uyğundur. Tətbiq yalnız öz konteyneri daxilində faylları izləyə bilər. Digər tətbiqlərin fayllarına giriş üçün App Groups və ya Security-Scoped Bookmark istifadə olunur. Koordinator sandbox icazələri çərçivəsində işləyir.

presentedItemDidChange çox tez-tez çağırılırsa nə etməli?

presentedItemDidChange metodunun daxilində debounce və ya throttle istifadə edin. 0.3-0.5 saniyə gecikmə ilə taymer yaradın və hər yeni çağırışda onu sıfırlayın. Sabitləşmədən sonra məlumatların yenidən yüklənməsini həyata keçirin. Bu, bir dəyişiklik paketinin təkrar emalının qarşısını alır.

Nəticə

  • NSFilePresenter — iOS və macOS-da fayl dəyişiklikləri barədə bildiriş almaq üçün Foundation protokolu, yalnız NSFileCoordinator ilə birlikdə işləyir.
  • Məcburi xüsusiyyət presentedItemURL — onsuz obyekt prezenter kimi qeydiyyatdan keçə bilməz və bildiriş almayacaq.
  • Əsas metod presentedItemDidChange fayl məzmununun istənilən dəyişməsindən sonra çağırılır — məlumatları yenidən yükləmək üçün istifadə edin.
  • accommodatePresentedItemDeletion faylın silinməsini düzgün emal etməyə və tətbiqin cari vəziyyətini saxlamağa imkan verir.
  • NSFileCoordinator bloklamaları idarə edir və əməliyyatların atomarlığına zəmanət verir — koordinator olmadan prezeder faydasızdır.
  • Tipik səhvlər əməliyyat növbəsinin olmaması, metodlarda bloklama və tsiklik koordinasiyanı əhatə edir — layihələndirmə ilə onlardan qaçınmaq vacibdir.
  • Debounce presentedItemDidChange tez-tez çağırışlarda — yenidən yükləmədən əvvəl dəyişiklikləri qruplaşdırmaq üçün taymerdən istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun