NSFileCoordinator — iOS میں فائل تک رسائی کا کوآرڈینیشن

مصنف: IT Sectr اشاعت: 2026-07-11 مطالعے کا وقت: 7 منٹ

NSFileCoordinator ایک Foundation کلاس ہے iOS اور macOS میں جو متعدد تھریڈز، پروسیسز یا ایکسٹینشنز کے بیک وقت کام کرنے پر محفوظ فائل تک رسائی کو یقینی بناتی ہے۔ Apple ڈیولپر دستاویزات، 2024 کے مطابق، NSFileCoordinator فائلوں کو پڑھنے اور لکھنے کے دوران ریس کنڈیشن کو روکتا ہے، اس بات کی ضمانت دیتا ہے کہ کوئی پروسیس ڈیٹا نہ پڑھے جبکہ دوسرا اسے تبدیل کر رہا ہو۔ کوآرڈینیٹر iCloud Drive، File Provider Extension اور کسی بھی ملٹی تھریڈڈ فائل آپریشن میں استعمال ہوتا ہے۔

اہم نکات

  • NSFileCoordinator — متعدد تھریڈز اور پروسیسز سے محفوظ فائل تک رسائی کے لیے ایک کلاس
  • کوآرڈینیشن نیت (reading/writing intent) عملدرآمد سے پہلے آپریشن کی قسم کا اعلان کرتی ہے
  • ریس کنڈیشن کی روک تھام — متوازی رسائی میں کوآرڈینیٹر کا بنیادی کام
  • File Provider سپورٹ — iCloud Drive اور ایکسٹینشن فائلوں کے ساتھ کام کرتے وقت کوآرڈینیٹر لازمی ہے
  • NSFilePresenter — دوسرے پروسیسز سے فائل تبدیلیوں کے بارے میں اطلاعات حاصل کرنے کے لیے ایک پروٹوکول

NSFileCoordinator کیا ہے؟

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 عمل میں: کوڈ مثالیں

بنیادی پیٹرن NSFileCoordinator کے استعمال میں تین مراحل ہوتے ہیں: کوآرڈینیٹر کی ایک مثال بنائیں، ایک نیت کا اعلان کریں (پڑھنا یا لکھنا)، اور کوآرڈینیشن بلاک کے اندر آپریشن انجام دیں۔ کوآرڈینیٹر ضمانت دیتا ہے کہ کوئی دوسرا کوآرڈینیٹر بیک وقت اسی فائل کے ساتھ کام نہیں کرے گا۔

swift
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)"
        )
    }
}

بیچ آپریشن — کوآرڈینیٹر نیتوں کی ایک صف کا استعمال کرتے ہوئے ایک ہی آپریشن میں متعدد فائلوں کو ہینڈل کر سکتا ہے۔ یہ فائلوں کے ایک سیٹ کو ایک ہی لین دین کے طور پر منتقل کرنے، کاپی کرنے یا حذف کرنے کے لیے آسان ہے۔ اگر ایک نیت پوری نہیں کی جا سکتی، تو پورا آپریشن ایک خرابی کے ساتھ منسوخ کر دیا جاتا ہے۔

swift
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 پروٹوکول اور اطلاعات

NSFilePresenter ایک پروٹوکول ہے جسے ایک آبجیکٹ NSFileCoordinator کے ذریعے مربوط فائلوں میں تبدیلیوں کے بارے میں اطلاعات حاصل کرنے کے لیے لاگو کرتا ہے۔ اگر آپ کی ایپلیکیشن کسی فائل کے مواد کو ظاہر کرتی ہے جو کسی دوسرے پروسیس کے ذریعے تبدیل ہو سکتی ہے (مثال کے طور پر، iCloud Drive ایک نیا ورژن مطابقت پذیر کرتا ہے)، NSFilePresenter کو لاگو کرنا بروقت انٹرفیس کو اپ ڈیٹ کرنے کی اجازت دیتا ہے۔

swift
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 کیا ہے؟

NSFileCoordinator متعدد تھریڈز یا پروسیسز سے محفوظ فائل تک رسائی کے لیے ایک Foundation کلاس ہے۔ یہ فائل سسٹم کی سطح پر پڑھنے اور لکھنے کے آپریشنز کو مربوط کرکے ریس کنڈیشن کو روکتا ہے۔

NSFileCoordinator NSLock سے کیسے مختلف ہے؟

NSLock صرف ایک پروسیس کے اندر (تھریڈز کے درمیان) کام کرتا ہے۔ NSFileCoordinator iCloud Drive مطابقت پذیری اور File Provider Extension سمیت مختلف پروسیسز اور ایکسٹینشنز کے درمیان رسائی کو مربوط کرتا ہے۔

کیا iCloud Drive کے لیے NSFileCoordinator استعمال کرنا لازمی ہے؟

ہاں، Apple Ubiquity کنٹینر میں تمام فائل آپریشنز کے لیے NSFileCoordinator استعمال کرنے کی سختی سے سفارش کرتا ہے۔ کوآرڈینیٹر کے بغیر، آلات کے درمیان مطابقت پذیری کے دوران ڈیٹا کرپشن اور File Provider Extension کے ساتھ تنازعات ہو سکتے ہیں۔

NSFilePresenter کیا ہے؟

NSFilePresenter فائل تبدیلیوں کے بارے میں اطلاعات حاصل کرنے کے لیے ایک پروٹوکول ہے۔ یہ ایپلیکیشن کو دوسرے پروسیسز کی تبدیلیوں پر ردعمل ظاہر کرنے کی اجازت دیتا ہے: ترمیم پر UI اپ ڈیٹ کرنا، منتقلی کو ہینڈل کرنا، یا فائل حذف کرنے کی تیاری کرنا۔

NSFileCoordinator کس قسم کی نیتوں کو سپورٹ کرتا ہے؟

پانچ اقسام: ReadingIntent (پڑھنا)، WritingIntent (لکھنا)، .withoutChanges کے ساتھ ReadingIntent (ٹریکنگ کے بغیر پڑھنا)، .contentIndependentMetadataOnly کے ساتھ WritingIntent (صرف میٹا ڈیٹا) اور .forDeleting کے ساتھ WritingIntent (حذف کرنا)۔ ہر ایک فائل تک رسائی کی سطح کی وضاحت کرتا ہے۔

خلاصہ

  • NSFileCoordinator — تھریڈز، پروسیسز اور ایکسٹینشنز سے محفوظ فائل تک رسائی کے لیے ایک نظامی طریقہ کار
  • کوآرڈینیشن نیتیں (پڑھنا/لکھنا) عملدرآمد سے پہلے آپریشن کی قسم کا اعلان کرتی ہیں
  • پڑھنا متوازی اجازت ہے، لکھنا خصوصی ہے (ریڈرز-رائٹر ماڈل)
  • NSFilePresenter — دوسرے پروسیسز سے فائل تبدیلیوں کی اطلاعات کے لیے پروٹوکول
  • iCloud Drive اور File Provider ڈیٹا کرپشن کو روکنے کے لیے لازمی کوآرڈینیشن کی ضرورت ہے
  • کوآرڈینیشن بلاک کے اندر وقت کم سے کم کریں — طویل آپریشنز دوسرے پروسیسز کی رسائی کو روکتے ہیں
  • ڈیڈ لاک بیچ آپریشنز اور نیسٹڈ کوآرڈینیٹر کالز سے بچ کر روکے جاتے ہیں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں