NSFileCoordinator ایک Foundation کلاس ہے iOS اور macOS میں جو متعدد تھریڈز، پروسیسز یا ایکسٹینشنز کے بیک وقت کام کرنے پر محفوظ فائل تک رسائی کو یقینی بناتی ہے۔ Apple ڈیولپر دستاویزات، 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں