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 — 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.
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.
İş 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.
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.
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.
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.
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.
NSFileCoordinator və NSFilePresenter — 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.
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.
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.
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.
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əhv | Nəticə | Həll |
|---|---|---|
| Əməliyyat növbəsi yoxdur | Çoxiplikdə məlumat yarışı | OperationQueue təyin edin |
| Metodlarda bloklama | Koordinatorun donması | Fon ipliyinə köçürün |
| Deletion ın göz ardı edilməsi | Silinmə zamanı məlumat itkisi | Saxlamağı icra edin |
| Tsiklik koordinasiya | Tətbiqin deadlock-u | isCoordinatedOperation bayrağı |
Tez-tez verilən suallar
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.
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.
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 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 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ə
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.
Həm də oxuyun