NSFilePresenter — bu iOS va macOS fayl tizimidagi fayllar va kataloglarning o'zgarishi haqida obyektga bildirishnomalar olish imkonini beruvchi Foundation protokolidir. Sinif protokol usullarini amalga oshiradi va NSFileCoordinator orqali ro'yxatdan o'tadi, shundan so'ng tizim kuzatilayotgan fayl bilan har qanday operatsiyada ushbu usullarni avtomatik chaqiradi. Apple Developer Documentation (2025) ma'lumotlariga ko'ra, NSFilePresenter yozish mojarolarini oldini olish uchun ko'p tarmoqli hujjatlarga ega ilovalarda qo'llaniladi. Protokol majburiy ravishda NSFileCoordinator bilan birgalikda ishlatiladi — faqat shu tarzda xavfsiz muvofiqlashtirish ta'minlanadi.
Asosiy fikrlar
NSFilePresenter — bu Apple operatsion tizimlarida fayl va kataloglarning o'zgarishini kuzatish uchun mo'ljallangan Foundation protokoli. Protokol kuzatuvchi obyektning fayl tizimi hodisalari haqida bildirishnomalar olishi uchun amalga oshiradigan usullar to'plamini belgilaydi.
Protokolning asosiy vazifasi ko'p tarmoqli stsenariylarda fayllarga xavfsiz kirishni ta'minlashdir. iOS va macOS da bir nechta jarayon va tarmoqlar bir vaqtning o'zida NSFileCoordinator orqali bir faylga murojaat qilishi mumkin va NSFilePresenter har bir ishtirokchining dolzarb ma'lumot holatini olishini kafolatlaydi.
Protokol iOS 5.0 va macOS 10.7 dan boshlab Foundation tarkibiga kiritilgan. U hujjatlar, ma'lumotlar bazalari va turli manbalardan bir vaqtning o'zida o'zgarishi mumkin bo'lgan har qanday fayllar bilan ishlaydigan ilovalarda — masalan, iCloud orqali sinxronlash yoki birgalikda tahrirlashda qo'llaniladi.
Hujjatga yo'naltirilgan ilovalar — NSFilePresenter dan foydalanishning asosiy sohasi. UIDocument yoki NSDocument bilan ishlaydigan ilovalar NSFileCoordinator orqali avtomatik ravishda o'zlarini presenter sifatida ro'yxatdan o'tkazadilar. Bu bir faylni bir nechta oyna yoki qurilmalardan tahrirlashda mojarolarni to'g'ri qayta ishlash imkonini beradi.
iCloud sinxronizatsiyasi — ikkinchi asosiy stsenariy. Fayl bir qurilmada o'zgarganda, iCloud uni barcha ulangan qurilmalarda sinxronlaydi. NSFilePresenter ilovani ushbu o'zgarishlar haqida xabardor qiladi va interfeysni o'z vaqtida yangilash imkonini beradi.
Ko'p tarmoqli muharrirlar — uchinchi stsenariy. Fon navbatlari foydalanuvchi ishi bilan bir vaqtda ma'lumotlarni yuklaydigan va saqlaydigan ilovalarda NSFilePresenter fayllarni yozish va o'qishda poyga holatining oldini oladi.
Ish mexanizmi NSFilePresenter delegatsiya modeliga asoslanadi: obyekt protokol usullarini amalga oshiradi, NSFileCoordinator orqali ro'yxatdan o'tadi va kuzatilayotgan fayl har o'zgarganda chaqiruvlarni oladi. Tizim o'zgarish qachon sodir bo'lganini va qaysi usullarni chaqirish kerakligini o'zi aniqlaydi.
Jarayon obyektning NSFileCoordinator namunasini yaratishi va fayl URL ini uzatib, koordinator usulini chaqirishi bilan boshlanadi. Koordinator ushbu URL uchun biron bir presenter ro'yxatdan o'tganligini tekshiradi. Agar mavjud bo'lsa, o'qish yoki yozishga kirishni bloklaydi va protokol usullari orqali presenterlarga yaqinlashib kelayotgan o'zgarish haqida xabar beradi.
Operatsiya tugagandan so'ng, koordinator blokirovkani olib tashlaydi va yakuniy bildirishnomalarni chaqiradi. Presenter ijro oqimini boshqarmasligi muhim — u faqat hodisalarga reaksiya beradi. Muvofiqlashtirishga to'liq NSFileCoordinator javobgardir.
Tayyorgarlik bosqichi — operatsiyani bajarishdan oldin koordinator accommodatePresentedItemDeletion yoki accommodatePresentedSubitemDeletion usulini chaqiradi. Presenter vaziyatni qayta ishlashi yoki xato qaytarib, operatsiyani bekor qilishi mumkin. Bu bosqich ilovaga fayl o'zgartirilishidan oldin u bilan ishni to'g'ri yakunlash imkonini beradi.
Bildirishnoma bosqichi — operatsiya tugagandan so'ng koordinator presentedItemDidChange yoki presentedSubitemDidChange ni chaqiradi. Presenter fayl o'zgarganligi haqida signal oladi va uning mazmunini qayta o'qishi mumkin. Fayl ko'chirilishi uchun presentedItemDidMoveToURL yangi joylashuv bilan chaqiriladi.
Yakunlash bosqichi — koordinator barcha blokirovkalarni olib tashlaydi va resurslarni bo'shatadi. Presenter yangilangan ma'lumotlar bilan ishni davom ettirishi mumkin. Har uch bosqich bir tarmoqda sinxron ravishda bajariladi, shuning uchun protokol usullari uzoq kirish-chiqish operatsiyalarisiz tez ishlashi kerak.
NSFilePresenter protokoli bir nechta majburiy va ixtiyoriy usullarni o'z ichiga oladi. Yagona majburiy xususiyat — kuzatilayotgan fayl yoki katalog URL ini qaytaradigan presentedItemURL dir. Bu xususiyatsiz obyekt presenter sifatida ro'yxatdan o'ta olmaydi.
presentedItemURL — kuzatilayotgan faylga yo'lni qaytarishi kerak bo'lgan URL? turidagi xususiyat. Agar obyekt bir nechta faylni kuzatsa, xususiyat asosiy elementning URL ini qaytaradi. Kataloglar uchun katalogning o'z URL i qaytariladi.
presentedItemDidChange — kuzatilayotgan fayl mazmuni o'zgargandan so'ng chaqiriladi. Bu usulda presenter o'z ichki holatini yangilaydi va ma'lumotlarni qayta yuklaydi. Bu usul nima aniq o'zgarganligi haqida ma'lumot olmaydi — faqat o'zgarish faktini qayd qiladi.
accommodatePresentedItemDeletion — fayl o'chirilishidan oldin chaqiriladi. Presenter joriy holatni saqlashi, fayl deskriptorlarini yopishi yoki NSError qaytarib operatsiyani bekor qilishi mumkin. Agar usul xato qaytarsa, o'chirish operatsiyasi bajarilmaydi.
presentedItemDidMoveToURL — fayl ko'chirilgan yoki nomi o'zgartirilgandan so'ng chaqiriladi. Usul yangi URL oladi va presenter faylga havolani yangilashi kerak. Bu usulsiz presenter eski, mavjud bo'lmagan yo'lga ishora qilishda davom etadi.
NSFileCoordinator va NSFilePresenter — ajralmas juftlik. NSFileCoordinator fayllarga kirishni boshqaradi va presenter usullarini chaqiradi. Presenter to'g'ridan-to'g'ri fayl tizimi bilan ishlamaydi — barcha operatsiyalar o'zgarishlarning atomikligini kafolatlaydigan koordinator orqali amalga oshiriladi.
Koordinator presenterni NSFileCoordinator sinfining addFilePresenter usuli orqali ro'yxatdan o'tkazadi. Qo'shilgandan so'ng presenter bildirishnomalarni olishni boshlaydi. O'chirish removeFilePresenter orqali amalga oshiriladi. Tizim presenterga zaif havolani saqlaydi, shuning uchun obyekt kuzatish davrida tirik bo'lishi kerak.
Apple WWDC 2022 ma'lumotlariga ko'ra, NSFileCoordinator yadro darajasida muvofiqlashtirish mexanizmidan foydalanadi, bu blokirovkalarda minimal kechikishni ta'minlaydi. iOS ning eng yangi versiyalarida koordinator Sandbox va ilova kengaytmalari bilan ishlash uchun optimallashtirilgan.
Intention — har bir o'qish yoki yozish operatsiyasi muvofiqlashtirish blokiga o'ralgan bo'lishi kerak: o'qish coordinateReadingItemAtURL orqali, yozish coordinateWritingItemAtURL orqali. Koordinator blokning bajarilishi davomida faylni boshqa ishtirokchilar uchun avtomatik bloklaydi.
Guruhli muvofiqlashtirish — bir nechta fayllar bilan operatsiyalar uchun guruhli muvofiqlashtirish qo'llaniladi. Koordinator barcha ko'rsatilgan fayllarni atomik bloklaydi, operatsiyani bajaradi va blokirovkalarni olib tashlaydi. Bu hujjatlar to'plamlarini ko'chirish yoki nusxalashda juda muhimdir.
NSFilePresenter protokolini amalga oshiradigan va hujjat faylining o'zgarishlarini kuzatadigan DocumentPresenter sinfini yaratamiz. Sinf faylga havola, ichki ma'lumotlar va dolzarblik bayrog'ini o'z ichiga oladi.
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) {
// Hujjat ma'lumotlarini qayta ishlash
}
}
Sinf fayl o'zgarganda ma'lumotlarni qayta yuklash uchun presentedItemDidChange va o'chirishdan oldin holatni saqlash uchun accommodatePresentedItemDeletion ni amalga oshiradi. Operatsion navbat barcha bildirishnomalarning ketma-ket qayta ishlanishini kafolatlaydi.
Presenterni ro'yxatdan o'tkazish hujjat ochilganda NSFileCoordinator.addFilePresenter orqali amalga oshiriladi. Koordinatorga to'g'ri o'qish variantlarini uzatish muhim — o'zgartirishsiz operatsiyalar uchun withoutChanges yoki zudlik bilan kirish stsenariylari uchun immediatelyAvailable.
Birinchi keng tarqalgan xato — presentedItemOperationQueue ni amalga oshirmaslik. Agar navbat ko'rsatilmasa, bildirishnomalar istalgan tarmoqda kelishi mumkin, bu ma'lumotlar poygasiga olib keladi. Bildirishnomalarni qayta ishlash uchun doim ketma-ket OperationQueue dan foydalaning.
Ikkinchi xato — presenter usullarida blokirovka qilish. Protokol usullari koordinatordan sinxron chaqiriladi. Agar presenter uzoq muddatli operatsiyani (ma'lumotlar bazasiga yozish, tarmoq so'rovi) bajarayotgan bo'lsa, u koordinatorni barcha boshqa ishtirokchilar uchun bloklaydi. Og'ir operatsiyalarni fon navbatlariga o'tkazing.
Uchinchi xato — accommodatePresentedItemDeletion ni e'tiborsiz qoldirish. Agar presenter bu usulni amalga oshirmasa va xato qaytarmasa, fayl joriy holatni saqlamasdan o'chirilishi mumkin. Agar ular hali diskka yozilmagan bo'lsa, doim bu usulda ma'lumotlarni saqlang.
To'rtinchi xato — tsiklik muvofiqlashtirish. Presenter bildirishnoma usuli ichida xuddi shu fayl uchun yana koordinatorni chaqirganda, deadlock yuzaga keladi. Handler ichida muvofiqlashtirishni boshlashdan oldin isCoordinatedOperation bayrog'ini tekshiring.
| Xato | Natija | Yechim |
|---|---|---|
| Operatsion navbat yo'q | Ko'p tarmoqlilikda ma'lumotlar poygasi | OperationQueue belgilang |
| Usullarda blokirovka | Koordinatorning osilib qolishi | Fon tarmog'iga o'tkazing |
| Deletion ni e'tiborsiz qoldirish | O'chirishda ma'lumot yo'qotish | Saqlashni amalga oshiring |
| Tsiklik muvofiqlashtirish | Ilovaning deadlock i | isCoordinatedOperation bayrog'i |
Tez-tez so'raladigan savollar
NSFileHandle — bu boshqa jarayonlardan o'zgarishlar haqida bildirishnoma mexanizmlarini ta'minlamaydigan past darajadagi ma'lumotlarni o'qish va yozish interfeysidir. NSFilePresenter muvofiqlashtirish darajasida ishlaydi: faylning har qanday o'zgarishida — boshqa tarmoq, jarayon yoki iCloud bo'lishidan qat'iy nazar — tizimdan hodisalarni oladi.
Ha. NSFilePresenter NSFileCoordinator siz ma'nosiz. Presenter faqat qayta ishlash usullarini belgilaydi, koordinator esa blokirovkalarni boshqaradi va bu usullarni chaqiradi. Agar siz NSFilePresenter ni koordinator siz ishlatsangiz, bildirishnomalar yetkazilmaydi.
Bo'la oladi, lekin cheklovlar bilan. presentedItemURL xususiyati faqat bitta URL qaytaradi, shuning uchun bir nechta faylni kuzatish uchun NSFilePresenter protokoli pastki elementlar uchun qo'shimcha usullar bilan ishlatiladi. Muqobil — har bir fayl uchun alohida presenter namunasini yaratish.
NSFilePresenter iOS sandbox bilan to'liq mos keladi. Ilova faqat o'z konteyneri ichidagi fayllarni kuzatishi mumkin. Boshqa ilovalarning fayllariga kirish uchun App Groups yoki Security-Scoped Bookmark ishlatiladi. Koordinator sandbox ruxsatlari doirasida ishlaydi.
presentedItemDidChange usuli ichida debounce yoki throttle dan foydalaning. 0.3-0.5 soniya kechikish bilan taymer yarating va har bir yangi chaqiruvda uni qayta o'rnating. Barqarorlashgandan so'ng ma'lumotlarni qayta yuklashni amalga oshiring. Bu bir o'zgarishlar to'plamining qayta-qayta ishlanishining oldini oladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.