NSFileCoordinator iOS और macOS में Foundation क्लास है जो एक साथ कई थ्रेड्स, प्रक्रियाओं या एक्सटेंशन के काम करने पर सुरक्षित फ़ाइल एक्सेस सुनिश्चित करता है। Apple Developer Documentation, 2024 के अनुसार, NSFileCoordinator फ़ाइलों को पढ़ने और लिखने के दौरान रेस कंडीशन को रोकता है, यह गारंटी देता है कि कोई प्रक्रिया डेटा को तब न पढ़े जब दूसरी उसे संशोधित कर रही हो। कोऑर्डिनेटर iCloud Drive, File Provider Extension और किसी भी मल्टीथ्रेडेड फ़ाइल संचालन में उपयोग किया जाता है।
मुख्य बातें
NSFileCoordinator ऑपरेटिंग सिस्टम स्तर पर फ़ाइल एक्सेस सिंक्रनाइज़ेशन तंत्र है, जिसे Apple ने iOS 5 और macOS 10.7 Lion में पेश किया। पारंपरिक लॉक (NSLock, pthread_mutex) के विपरीत, कोऑर्डिनेटर फ़ाइल सिस्टम स्तर पर काम करता है और विभिन्न प्रक्रियाओं के बीच एक्सेस को समन्वित कर सकता है, न कि केवल एक ही एप्लिकेशन के थ्रेड्स के बीच।
NSFileCoordinator की आवश्यकता iOS की Sandbox आर्किटेक्चर से उत्पन्न होती है: प्रत्येक प्रक्रिया (एप्लिकेशन, एक्सटेंशन, सिस्टम सेवा) एक पृथक वातावरण में अपनी फ़ाइल एक्सेस के साथ चलती है। जब कई प्रक्रियाएँ एक साथ एक ही फ़ाइल को पढ़ने और लिखने का प्रयास करती हैं (उदाहरण के लिए, iCloud Drive सिंक्रनाइज़ेशन के दौरान), बिना कोऑर्डिनेटर के रेस कंडीशन उत्पन्न होती हैं: प्रक्रिया A फ़ाइल पढ़ती है जबकि प्रक्रिया B पहले ही इसे आंशिक रूप से अधिलेखित कर चुकी होती है।
WWDC 2023 के अनुसार, Apple Ubiquity कंटेनर (iCloud Drive) में सभी फ़ाइल संचालनों और File Provider Extension के साथ काम करते समय NSFileCoordinator का उपयोग करने की दृढ़ता से अनुशंसा करता है। समन्वय की अनदेखी iOS एप्लिकेशन में डेटा भ्रष्टाचार और गैर-पुनरुत्पादनीय बग के सामान्य कारणों में से एक है।
समन्वय आशय (NSFileCoordinator.ReadingIntent / WritingIntent) एक ऑब्जेक्ट है जो उस संचालन के प्रकार की घोषणा करता है जिसे एक थ्रेड या प्रक्रिया निष्पादित करने की योजना बनाती है। कोऑर्डिनेटर एक्सेस क्रम निर्धारित करने और विवादों को हल करने के लिए इन आशयों का उपयोग करता है।
| आशय का प्रकार | विवरण | कब उपयोग करें |
|---|---|---|
| ReadingIntent | बिना संशोधन के फ़ाइल पढ़ना | दस्तावेज़ खोलना, डेटा लोड करना |
| WritingIntent | संभावित सामग्री संशोधन के साथ लिखना | दस्तावेज़ सहेजना, संपादन |
| ReadingIntent(URL, options: .withoutChanges) | परिवर्तन ट्रैकिंग के बिना पढ़ना | त्वरित सामग्री पूर्वावलोकन |
| WritingIntent(URL, options: .contentIndependentMetadataOnly) | केवल मेटाडेटा संशोधित करना | दिनांक या विशेषताएँ अपडेट करना |
| WritingIntent(URL, options: .forDeleting) | फ़ाइल हटाना | उपयोगकर्ता द्वारा दस्तावेज़ हटाना |
समन्वय नियम: एक साथ कई पढ़ने की अनुमति है (यदि कोई सक्रिय लेखन न हो), लेखन अनन्य है — लेखन संचालन के दौरान कोई पढ़ना या लिखना अनुमत नहीं है। यह रीडर्स-राइटर लॉक मॉडल का अनुसरण करता है, लेकिन launchd और XPC के माध्यम से अंतर-प्रक्रिया समन्वय के लिए अतिरिक्त समर्थन के साथ।
महत्वपूर्ण बारीकी: NSFileCoordinator सामान्य NSData या FileManager के माध्यम से फ़ाइल एक्सेस को नहीं रोकता — यह केवल उन संचालनों का समन्वय करता है जो स्पष्ट रूप से समन्वय ब्लॉक में लिपटे हों। यदि कोई अन्य थ्रेड कोऑर्डिनेटर के बिना सीधे फ़ाइल तक पहुँचता है, तो वही रेस कंडीशन उत्पन्न होती हैं जिन्हें कोऑर्डिनेटर रोकने के लिए डिज़ाइन किया गया है।
मूल पैटर्न NSFileCoordinator के उपयोग में तीन चरण होते हैं: कोऑर्डिनेटर का एक इंस्टेंस बनाएँ, एक आशय घोषित करें (पढ़ना या लिखना), और समन्वय ब्लॉक के अंदर संचालन निष्पादित करें। कोऑर्डिनेटर गारंटी देता है कि कोई अन्य कोऑर्डिनेटर एक साथ उसी फ़ाइल के साथ काम नहीं करेगा।
import Foundation
let coordinator = NSFileCoordinator()
let fileURL = getDocumentURL()
// Safe reading
let readIntent = NSFileCoordinator
.ReadingIntent(url: fileURL)
var content: Data?
var readError: NSError?
coordinator.coordinate(with: readIntent) { error in
if let error = error {
readError = error
return
}
content = try? Data(contentsOf: fileURL)
}
// Safe writing
let writeIntent = NSFileCoordinator
.WritingIntent(url: fileURL)
coordinator.coordinate(with: writeIntent) { error in
guard error == nil else { return }
do {
try newData.write(to: fileURL)
} catch {
Logger.storage.error(
"Write failed: \(error)"
)
}
}
बैच संचालन — कोऑर्डिनेटर आशयों की एक सरणी का उपयोग करके एक ही संचालन में कई फ़ाइलों को संभाल सकता है। यह फ़ाइलों के एक सेट को एकल लेन-देन के रूप में स्थानांतरित, कॉपी या हटाने के लिए सुविधाजनक है। यदि एक आशय पूरा नहीं किया जा सकता, तो पूरा संचालन एक त्रुटि के साथ रद्द कर दिया जाता है।
let coordinator = NSFileCoordinator()
let readIntent = NSFileCoordinator
.ReadingIntent(url: sourceURL)
let writeIntent = NSFileCoordinator
.WritingIntent(url: destURL)
coordinator.coordinate(
with: [readIntent, writeIntent]
) { error in
try? FileManager.default
.copyItem(at: sourceURL, to: destURL)
}
अतुल्यकालिक समन्वय — iOS 15 से शुरू, NSFileCoordinator कम्प्लीशन हैंडलर के साथ अतुल्यकालिक विधियों का समर्थन करता है, जो कॉल करने वाले थ्रेड को ब्लॉक किए बिना समन्वय की अनुमति देता है। यह UI थ्रेड के लिए महत्वपूर्ण है, जहाँ समन्वय के लिए तुल्यकालिक प्रतीक्षा सेकंडों के लिए इंटरफ़ेस फ़्रीज़ कर सकती है।
NSFilePresenter एक प्रोटोकॉल है जिसे एक ऑब्जेक्ट NSFileCoordinator द्वारा समन्वित फ़ाइलों में परिवर्तनों के बारे में सूचनाएँ प्राप्त करने के लिए कार्यान्वित करता है। यदि आपका एप्लिकेशन किसी फ़ाइल की सामग्री प्रदर्शित करता है जो किसी अन्य प्रक्रिया द्वारा बदली जा सकती है (उदाहरण के लिए, iCloud Drive एक नया संस्करण सिंक करता है), तो NSFilePresenter को लागू करना समय पर इंटरफ़ेस अपडेट करने की अनुमति देता है।
class DocumentPresenter: NSFilePresenter {
let presentedItemURL: URL?
let presentedItemOperationQueue: OperationQueue
init(url: URL) {
presentedItemURL = url
presentedItemOperationQueue = OperationQueue()
}
func presentedItemDidChange() {
DispatchQueue.main.async {
NotificationCenter.default
.post(name: .documentDidChange,
object: self)
}
}
func presentedItemDidMove(to newURL: URL) {
Logger.storage.info(
"File moved to: \(newURL.lastPathComponent)"
)
}
func accommodatePresentedItemDeletion(
completionHandler: @escaping (Error?) -> Void
) {
Logger.storage.warn("File deleted externally")
completionHandler(nil)
}
}
प्रोटोकॉल विधियाँ: जब फ़ाइल सामग्री बदलती है तो presentedItemDidChange कॉल किया जाता है, फ़ाइल स्थानांतरण के बाद presentedItemDidMove(to:), किसी अन्य प्रक्रिया द्वारा फ़ाइल हटाने से पहले accommodatePresentedItemDeletion (एप्लिकेशन को फ़ाइल को सही ढंग से बंद करने की अनुमति देता है)। इसके अतिरिक्त, प्रोटोकॉल presentedItemDidGainVersion: और presentedItemDidLoseVersion: के माध्यम से संस्करण नियंत्रण का समर्थन करता है।
महत्वपूर्ण: NSFilePresenter को NSFileCoordinator.addFilePresenter: के माध्यम से सिस्टम में पंजीकृत होना चाहिए। पंजीकरण के बिना, सूचनाएँ वितरित नहीं होंगी। पंजीकरण एप्लिकेशन स्टार्टअप पर एक बार किया जाता है और प्रस्तुतकर्ता के पुनर्निर्माण पर पुनः पंजीकरण की आवश्यकता नहीं होती है।
हमेशा कोऑर्डिनेटर का उपयोग करें Ubiquity कंटेनर (iCloud Drive) और एक्सटेंशन के लिए सुलभ निर्देशिकाओं में फ़ाइलों के लिए। भले ही एप्लिकेशन वर्तमान में एकल-थ्रेडेड हो, भविष्य के अपडेट या सिस्टम परिवर्तन समानांतर एक्सेस जोड़ सकते हैं, और समन्वय की कमी से ढूँढने में कठिन बग होंगे।
समन्वय ब्लॉक के अंदर समय कम करें। जब ब्लॉक निष्पादित हो रहा है, अन्य प्रक्रियाएँ फ़ाइल तक नहीं पहुँच सकतीं। ब्लॉक के अंदर लंबे संचालन (जटिल डेटा प्रोसेसिंग, नेटवर्क अनुरोध) पूरे फ़ाइल एक्सेस सिस्टम को ब्लॉक कर देते हैं। ब्लॉक के अंदर केवल डेटा पढ़ना या लिखना करें, और प्रसंस्करण इसके बाहर करें।
डेडलॉक से बचें: एक ही फ़ाइल के लिए किसी अन्य कोऑर्डिनेटर के ब्लॉक के अंदर से कोऑर्डिनेटर को कॉल न करें — इससे पारस्परिक डेडलॉक होगा। नेस्टेड कॉल के बजाय बैच संचालन (आशयों की सरणी) का उपयोग करें। यदि नेस्टिंग आवश्यक है, तो विभिन्न कतारों या विभिन्न URL का उपयोग करें।
objc.io (2024) के अनुसार, NSFileCoordinator के साथ काम करते समय सामान्य त्रुटियों में शामिल हैं: कम्प्लीशन हैंडलर में त्रुटि प्रबंधन की कमी (अपूर्ण संचालन की ओर ले जाती है); केवल लेखन के लिए समन्वय लेकिन पढ़ने के लिए नहीं; UI थ्रेड में पुरानी तुल्यकालिक API का उपयोग; iCloud Drive के साथ काम करते समय NSFilePresenter प्रोटोकॉल की अनदेखी। अंतिम त्रुटि सबसे कपटी है: एप्लिकेशन पुराना डेटा प्रदर्शित करता है बिना यह जाने कि फ़ाइल पहले ही संशोधित हो चुकी है।
अक्सर पूछे जाने वाले प्रश्न
NSFileCoordinator कई थ्रेड्स या प्रक्रियाओं से सुरक्षित फ़ाइल एक्सेस के लिए Foundation क्लास है। यह फ़ाइल सिस्टम स्तर पर पढ़ने और लिखने के संचालन का समन्वय करके रेस कंडीशन को रोकता है।
NSLock केवल एक प्रक्रिया के अंदर (थ्रेड्स के बीच) काम करता है। NSFileCoordinator विभिन्न प्रक्रियाओं और एक्सटेंशन के बीच एक्सेस का समन्वय करता है, जिसमें iCloud Drive सिंक्रनाइज़ेशन और File Provider Extension शामिल हैं।
हाँ, Apple Ubiquity कंटेनर में सभी फ़ाइल संचालनों के लिए NSFileCoordinator का उपयोग करने की दृढ़ता से अनुशंसा करता है। कोऑर्डिनेटर के बिना, उपकरणों के बीच सिंक्रनाइज़ेशन के दौरान डेटा भ्रष्टाचार और File Provider Extension के साथ विरोध हो सकता है।
NSFilePresenter फ़ाइल परिवर्तनों के बारे में सूचनाएँ प्राप्त करने के लिए एक प्रोटोकॉल है। यह एप्लिकेशन को अन्य प्रक्रियाओं द्वारा किए गए परिवर्तनों पर प्रतिक्रिया करने की अनुमति देता है: संशोधन पर UI अपडेट करना, स्थानांतरण को संभालना, या फ़ाइल हटाने की तैयारी करना।
पाँच प्रकार: ReadingIntent (पढ़ना), WritingIntent (लिखना), .withoutChanges के साथ ReadingIntent (बिना ट्रैकिंग के पढ़ना), .contentIndependentMetadataOnly के साथ WritingIntent (केवल मेटाडेटा) और .forDeleting के साथ WritingIntent (हटाना)। प्रत्येक फ़ाइल तक पहुँच का स्तर निर्धारित करता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें