NSFilePresenter एक Foundation प्रोटोकॉल है जो किसी ऑब्जेक्ट को iOS और macOS फ़ाइल सिस्टम में फ़ाइलों और निर्देशिकाओं में परिवर्तनों के बारे में सूचनाएँ प्राप्त करने की अनुमति देता है। क्लास प्रोटोकॉल विधियों को लागू करता है और NSFileCoordinator के माध्यम से पंजीकृत होता है, जिसके बाद सिस्टम ट्रैक की गई फ़ाइल के साथ किसी भी संचालन के दौरान स्वचालित रूप से इन विधियों को कॉल करता है। Apple डेवलपर डॉक्यूमेंटेशन (2025) के अनुसार, NSFilePresenter का उपयोग लेखन संघर्षों को रोकने के लिए मल्टी-थ्रेडेड दस्तावेज़ एक्सेस वाले अनुप्रयोगों में किया जाता है। प्रोटोकॉल का उपयोग NSFileCoordinator के साथ संयोजन में किया जाना चाहिए — केवल यह सुरक्षित एक्सेस समन्वय सुनिश्चित करता है।
मुख्य बिंदु
NSFilePresenter एक Foundation प्रोटोकॉल है जो Apple ऑपरेटिंग सिस्टम में फ़ाइलों और निर्देशिकाओं में परिवर्तनों को ट्रैक करने के लिए डिज़ाइन किया गया है। प्रोटोकॉल विधियों का एक सेट परिभाषित करता है जिसे प्रेक्षक ऑब्जेक्ट फ़ाइल सिस्टम ईवेंट सूचनाएँ प्राप्त करने के लिए लागू करता है।
प्रोटोकॉल का मुख्य उद्देश्य मल्टी-थ्रेडेड परिदृश्यों में सुरक्षित फ़ाइल एक्सेस प्रदान करना है। iOS और macOS में, कई प्रक्रियाएँ और थ्रेड NSFileCoordinator के माध्यम से एक साथ एक ही फ़ाइल तक पहुँच सकते हैं, और NSFilePresenter सुनिश्चित करता है कि प्रत्येक प्रतिभागी को डेटा की नवीनतम स्थिति प्राप्त हो।
प्रोटोकॉल iOS 5.0 और macOS 10.7 से Foundation में शामिल है। इसका उपयोग दस्तावेज़ों, डेटाबेस और किसी भी फ़ाइल के साथ काम करने वाले अनुप्रयोगों में किया जाता है जो एक साथ विभिन्न स्रोतों से संशोधित हो सकती हैं — उदाहरण के लिए, iCloud सिंक्रोनाइज़ेशन या सहयोगी संपादन के दौरान।
दस्तावेज़-आधारित अनुप्रयोग — NSFilePresenter के उपयोग का मुख्य क्षेत्र। UIDocument या NSDocument के साथ काम करने वाले अनुप्रयोग स्वचालित रूप से NSFileCoordinator के माध्यम से स्वयं को प्रस्तुतकर्ता के रूप में पंजीकृत करते हैं। यह कई विंडो या उपकरणों से एक ही फ़ाइल को संपादित करते समय संघर्षों को सही ढंग से संभालने की अनुमति देता है।
iCloud सिंक्रोनाइज़ेशन — दूसरा प्रमुख परिदृश्य। जब एक उपकरण पर फ़ाइल संशोधित की जाती है, iCloud इसे सभी कनेक्टेड उपकरणों पर सिंक करता है। NSFilePresenter अनुप्रयोग को इन परिवर्तनों के बारे में सूचित करता है, जिससे समय पर इंटरफ़ेस अपडेट संभव होता है।
मल्टी-थ्रेडेड संपादक — तीसरा परिदृश्य। उन अनुप्रयोगों में जहाँ पृष्ठभूमि कतारें उपयोगकर्ता के काम के साथ एक साथ डेटा लोड और सहेजती हैं, NSFilePresenter फ़ाइल लेखन और पढ़ने के दौरान रेस कंडीशन को रोकता है।
कार्य तंत्र NSFilePresenter का प्रतिनिधिमंडल मॉडल पर आधारित है: ऑब्जेक्ट प्रोटोकॉल विधियों को लागू करता है, NSFileCoordinator के माध्यम से पंजीकृत होता है, और जब भी ट्रैक की गई फ़ाइल बदलती है तो कॉल प्राप्त करता है। सिस्टम स्वयं निर्धारित करता है कि परिवर्तन कब होता है और कौन सी विधियाँ आह्वान करनी हैं।
प्रक्रिया तब शुरू होती है जब ऑब्जेक्ट NSFileCoordinator का एक इंस्टेंस बनाता है और फ़ाइल URL पास करते हुए समन्वयक की विधि को कॉल करता है। समन्वयक जाँचता है कि क्या इस URL के लिए कोई प्रस्तुतकर्ता पंजीकृत हैं। यदि हाँ, तो वह पढ़ने या लिखने की पहुँच को अवरुद्ध करता है और प्रोटोकॉल विधियों के माध्यम से प्रस्तुतकर्ताओं को आगामी परिवर्तन के बारे में सूचित करता है।
संचालन पूरा होने के बाद, समन्वयक लॉक जारी करता है और अंतिम सूचनाएँ कॉल करता है। ध्यान देने योग्य बात यह है कि प्रस्तुतकर्ता निष्पादन प्रवाह को नियंत्रित नहीं करता — वह केवल घटनाओं पर प्रतिक्रिया करता है। NSFileCoordinator समन्वय के लिए पूरी तरह से जिम्मेदार है।
तैयारी चरण — संचालन निष्पादित करने से पहले, समन्वयक accommodatePresentedItemDeletion या accommodatePresentedSubitemDeletion को कॉल करता है। प्रस्तुतकर्ता स्थिति को संभाल सकता है या त्रुटि लौटाकर संचालन रद्द कर सकता है। यह चरण अनुप्रयोग को फ़ाइल के संशोधित होने से पहले उसके साथ काम को सही ढंग से समाप्त करने की अनुमति देता है।
सूचना चरण — संचालन पूरा होने के बाद, समन्वयक presentedItemDidChange या presentedSubitemDidChange को कॉल करता है। प्रस्तुतकर्ता को संकेत मिलता है कि फ़ाइल बदल गई है और वह इसकी सामग्री को फिर से पढ़ सकता है। फ़ाइल स्थानांतरण के लिए, नए स्थान के साथ presentedItemDidMoveToURL कॉल किया जाता है।
पूर्णता चरण — समन्वयक सभी लॉक जारी करता है और संसाधन मुक्त करता है। प्रस्तुतकर्ता अद्यतन डेटा के साथ काम जारी रख सकता है। तीनों चरण एक ही थ्रेड में समकालिक रूप से निष्पादित होते हैं, इसलिए प्रोटोकॉल विधियों को लंबी I/O संचालन के बिना जल्दी से निष्पादित होना चाहिए।
NSFilePresenter प्रोटोकॉल में कई अनिवार्य और वैकल्पिक विधियाँ हैं। एकमात्र अनिवार्य गुण presentedItemURL है, जो ट्रैक की गई फ़ाइल या निर्देशिका का URL लौटाता है। इस गुण के बिना, ऑब्जेक्ट को प्रस्तुतकर्ता के रूप में पंजीकृत नहीं किया जा सकता।
presentedItemURL — URL? प्रकार का एक गुण जो ट्रैक की गई फ़ाइल का पथ लौटाना चाहिए। यदि ऑब्जेक्ट कई फ़ाइलों को ट्रैक करता है, तो गुण मुख्य आइटम का URL लौटाता है। निर्देशिकाओं के लिए, यह निर्देशिका का URL लौटाता है।
presentedItemDidChange — ट्रैक की गई फ़ाइल की सामग्री बदलने के बाद कॉल किया जाता है। इस विधि में, प्रस्तुतकर्ता अपनी आंतरिक स्थिति अपडेट करता है और डेटा पुनः लोड करता है। यह विधि इस बारे में जानकारी प्राप्त नहीं करती कि वास्तव में क्या बदला — केवल परिवर्तन का तथ्य।
accommodatePresentedItemDeletion — फ़ाइल हटाने से पहले कॉल किया जाता है। प्रस्तुतकर्ता वर्तमान स्थिति सहेज सकता है, फ़ाइल डिस्क्रिप्टर बंद कर सकता है, या NSError लौटाकर संचालन रद्द कर सकता है। यदि विधि त्रुटि लौटाती है, तो विलोपन संचालन निष्पादित नहीं होता।
presentedItemDidMoveToURL — फ़ाइल स्थानांतरण या नाम बदलने के बाद कॉल किया जाता है। विधि नया URL प्राप्त करती है, और प्रस्तुतकर्ता को फ़ाइल संदर्भ अपडेट करना होगा। इस विधि को लागू किए बिना, प्रस्तुतकर्ता पुराने, गैर-मौजूद पथ की ओर इशारा करता रहेगा।
NSFileCoordinator और NSFilePresenter एक अविभाज्य जोड़ी हैं। NSFileCoordinator फ़ाइलों तक पहुँच का प्रबंधन करता है और प्रस्तुतकर्ता विधियों को कॉल करता है। प्रस्तुतकर्ता सीधे फ़ाइल सिस्टम के साथ काम नहीं करता — सभी संचालन समन्वयक के माध्यम से होते हैं, जो परिवर्तनों की परमाणुता की गारंटी देता है।
समन्वयक NSFileCoordinator क्लास की addFilePresenter विधि के माध्यम से प्रस्तुतकर्ता को पंजीकृत करता है। पंजीकरण के बाद, प्रस्तुतकर्ता सूचनाएँ प्राप्त करना शुरू करता है। हटाना removeFilePresenter के माध्यम से किया जाता है। सिस्टम प्रस्तुतकर्ता के लिए एक कमज़ोर संदर्भ रखता है, इसलिए ऑब्जेक्ट ट्रैकिंग अवधि भर जीवित रहना चाहिए।
Apple WWDC 2022 के अनुसार, NSFileCoordinator कर्नेल-स्तरीय समन्वय तंत्र का उपयोग करता है, जो लॉकिंग के दौरान न्यूनतम विलंबता सुनिश्चित करता है। नवीनतम iOS संस्करणों में, समन्वयक Sandbox और ऐप एक्सटेंशन के साथ काम करने के लिए अनुकूलित है।
Intention — प्रत्येक पढ़ने या लिखने के संचालन को एक समन्वय ब्लॉक में लपेटा जाना चाहिए: coordinateReadingItemAtURL के माध्यम से पढ़ना, coordinateWritingItemAtURL के माध्यम से लिखना। समन्वयक ब्लॉक निष्पादन के दौरान अन्य प्रतिभागियों के लिए स्वचालित रूप से फ़ाइल को लॉक करता है।
बैच समन्वय — कई फ़ाइलों वाले संचालन के लिए बैच समन्वय का उपयोग किया जाता है। समन्वयक सभी निर्दिष्ट फ़ाइलों को परमाणु रूप से लॉक करता है, संचालन निष्पादित करता है, और लॉक जारी करता है। दस्तावेज़ सेट को स्थानांतरित या कॉपी करते समय यह अत्यंत महत्वपूर्ण है।
चलिए एक DocumentPresenter क्लास बनाते हैं जो NSFilePresenter प्रोटोकॉल को लागू करता है और दस्तावेज़ फ़ाइल में परिवर्तनों को ट्रैक करता है। क्लास में फ़ाइल का संदर्भ, आंतरिक डेटा और एक वैधता फ़्लैग होता है।
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) {
// दस्तावेज़ डेटा प्रॉसेसिंग
}
}
क्लास फ़ाइल बदलने पर डेटा पुनः लोड करने के लिए presentedItemDidChange और विलोपन से पहले स्थिति सहेजने के लिए accommodatePresentedItemDeletion लागू करता है। संचालन कतार सुनिश्चित करती है कि सभी सूचनाएँ क्रमिक रूप से संसाधित हों।
दस्तावेज़ खोलते समय NSFileCoordinator.addFilePresenter के माध्यम से प्रस्तुतकर्ता पंजीकरण किया जाता है। समन्वयक को सही पढ़ने के विकल्प पास करना महत्वपूर्ण है — गैर-संशोधित संचालन के लिए withoutChanges या तत्काल पहुँच की आवश्यकता वाले परिदृश्यों के लिए immediatelyAvailable।
पहली सामान्य गलती है presentedItemOperationQueue के कार्यान्वयन की कमी. यदि आप कतार निर्दिष्ट नहीं करते, सूचनाएँ किसी भी थ्रेड पर आ सकती हैं, जिससे डेटा रेस हो सकती है। सूचनाओं को संसाधित करने के लिए हमेशा एक अनुक्रमिक OperationQueue का उपयोग करें।
दूसरी गलती है प्रस्तुतकर्ता विधियों में अवरोधन. प्रोटोकॉल विधियाँ समन्वयक से समकालिक रूप से कॉल की जाती हैं। यदि प्रस्तुतकर्ता कोई लंबा संचालन (डेटाबेस लेखन, नेटवर्क अनुरोध) करता है, तो वह सभी अन्य प्रतिभागियों के लिए समन्वयक को अवरुद्ध कर देता है। भारी संचालन को पृष्ठभूमि कतारों में ले जाएँ।
तीसरी गलती है accommodatePresentedItemDeletion को अनदेखा करना. यदि प्रस्तुतकर्ता इस विधि को लागू नहीं करता और त्रुटि नहीं लौटाता, तो फ़ाइल वर्तमान स्थिति को सहेजे बिना हटाई जा सकती है। इस विधि में हमेशा डेटा सहेजें यदि वह अभी तक डिस्क पर नहीं लिखा गया है।
चौथी गलती है चक्रीय समन्वय. जब प्रस्तुतकर्ता सूचना विधि के अंदर उसी फ़ाइल के लिए फिर से समन्वयक को कॉल करता है, तो deadlock होता है। हैंडलर के अंदर समन्वय शुरू करने से पहले isCoordinatedOperation फ़्लैग जाँचें।
| गलती | परिणाम | समाधान |
|---|---|---|
| कोई संचालन कतार नहीं | मल्टी-थ्रेडिंग में डेटा रेस | OperationQueue निर्दिष्ट करें |
| विधियों में अवरोधन | समन्वयक हैंग | पृष्ठभूमि थ्रेड पर ले जाएँ |
| विलोपन को अनदेखा करना | हटाने पर डेटा हानि | सहेजना लागू करें |
| चक्रीय समन्वय | एप्लिकेशन deadlock | isCoordinatedOperation फ़्लैग |
अक्सर पूछे जाने वाले प्रश्न
NSFileHandle डेटा पढ़ने और लिखने के लिए एक निम्न-स्तरीय इंटरफ़ेस है जो अन्य प्रक्रियाओं से परिवर्तनों की सूचना तंत्र प्रदान नहीं करता। NSFilePresenter समन्वय स्तर पर काम करता है: यह सिस्टम से ईवेंट प्राप्त करता है जब भी फ़ाइल बदलती है, स्रोत — दूसरे थ्रेड, प्रक्रिया या iCloud — की परवाह किए बिना।
हाँ. NSFilePresenter का NSFileCoordinator के बिना कोई अर्थ नहीं है। प्रस्तुतकर्ता केवल हैंडलर विधियों को परिभाषित करता है, जबकि समन्वयक लॉक का प्रबंधन करता है और इन विधियों को कॉल करता है। यदि आप बिना समन्वयक के NSFilePresenter का उपयोग करते हैं, सूचनाएँ वितरित नहीं होंगी।
हो सकता है, लेकिन सीमाओं के साथ। presentedItemURL गुण केवल एक URL लौटाता है, इसलिए कई फ़ाइलों को ट्रैक करने के लिए उप-आइटम के लिए अतिरिक्त विधियों के साथ NSFilePresenter प्रोटोकॉल का उपयोग किया जाता है। विकल्प प्रत्येक फ़ाइल के लिए एक अलग प्रस्तुतकर्ता इंस्टेंस बनाना है।
NSFilePresenter iOS सैंडबॉक्स के साथ पूरी तरह से संगत है। एप्लिकेशन केवल अपने कंटेनर के अंदर फ़ाइलों को ट्रैक कर सकता है। अन्य अनुप्रयोगों की फ़ाइलों तक पहुँचने के लिए, App Groups या Security-Scoped Bookmarks का उपयोग किया जाता है। समन्वयक सैंडबॉक्स अनुमतियों के भीतर काम करता है।
presentedItemDidChange विधि के अंदर debounce या throttle का उपयोग करें। 0.3–0.5 सेकंड की देरी के साथ एक टाइमर बनाएँ और प्रत्येक नई कॉल पर इसे रीसेट करें। स्थिरीकरण के बाद, डेटा पुनः लोड करें। यह परिवर्तनों के एक बैच के कई प्रसंस्करण को रोकता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें