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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন