প্রথম, হ্যাঁ, এটি একটি থ্রেড-নিরাপদ সমাধান। এই dispatch_once
প্যাটার্নটি হ'ল উদ্দেশ্য, সি-তে একক জেনারেট করার জন্য থ্রেড-নিরাপদ উপায়। কোনও উদ্বেগ নেই।
আপনি জিজ্ঞাসা করেছেন, এটি করার জন্য এটি "সেরা" উপায় কিনা। একটি স্বীকৃতি দেওয়া উচিত, যদিও, যে instancetype
এবং[[self alloc] init]
সিঙ্গেলনের সাথে একযোগে ব্যবহার সম্ভবত সম্ভাব্য বিভ্রান্তিকর।
এর সুবিধা instancetype
হ'ল এটি ঘোষণার একটি দ্ব্যর্থহীন উপায় যে ক্লাসটি এক ধরণের অবলম্বন না করেই সাবক্ল্যাস করা যেতে পারে id
, যেমন আমাদের ইয়েটারিয়ারে করতে হয়েছিল।
তবে static
এই পদ্ধতিতে সাবক্লাসিং চ্যালেঞ্জ উপস্থাপন করা হয়। কী ImageCache
এবং যদি BlobCache
সিলেটলেটগুলি Cache
তাদের নিজস্ব sharedCache
পদ্ধতি প্রয়োগ না করে সুপারক্লাস থেকে উভয় সাবক্লাস হয় ?
ImageCache *imageCache = [ImageCache sharedCache]; // fine
BlobCache *blobCache = [BlobCache sharedCache]; // error; this will return the aforementioned ImageCache!!!
এটি কাজ করার জন্য, আপনাকে নিশ্চিত করতে হবে সাবক্লাসগুলি তাদের নিজস্ব প্রয়োগ করে sharedInstance
(বা যা আপনি এটি নির্দিষ্ট শ্রেণীর জন্য ডাকেন) পদ্ধতিটি ।
নীচের লাইন, আপনার আসল sharedInstance
চেহারাটি দেখে মনে হচ্ছে এটি সাবক্লাস সমর্থন করবে, তবে তা হবে না। আপনি যদি সাবক্লাসিং সমর্থন করতে চান, খুব কমপক্ষে এমন ডকুমেন্টেশন অন্তর্ভুক্ত করুন যা ভবিষ্যতের বিকাশকারীদের সতর্ক করে দেয় যে তাদের অবশ্যই এই পদ্ধতিটিকে ওভাররাইড করতে হবে।
সুইফ্টের সাথে সর্বোত্তম আন্তঃব্যবযোগিতার জন্য আপনি সম্ভবত এটি কোনও শ্রেণি পদ্ধতি নয়, সম্পত্তি হিসাবে সংজ্ঞায়িত করতে চান:
@interface Foo : NSObject
@property (class, readonly, strong) Foo *sharedFoo;
@end
তারপরে আপনি এগিয়ে গিয়ে এই সম্পত্তিটির জন্য একটি গিটার লিখতে পারেন (প্রয়োগটি dispatch_once
আপনার প্রস্তাবিত প্যাটার্নটি ব্যবহার করবে ):
+ (Foo *)sharedFoo { ... }
এর সুবিধাটি হ'ল যদি কোনও সুইফ্ট ব্যবহারকারী এটি ব্যবহার করতে যান তবে তারা এমন কিছু করতে চাইবেন:
let foo = Foo.shared
দ্রষ্টব্য, নেই ()
, কারণ আমরা এটিকে সম্পত্তি হিসাবে প্রয়োগ করেছি। সুইফ্ট 3 শুরু করে, এভাবেই সিলেটলেটগুলি সাধারণত অ্যাক্সেস করা হয়। সুতরাং এটি একটি সম্পত্তি হিসাবে সংজ্ঞায়িত করা যে আন্তঃআযোগিতা সহজতর করতে সহায়তা করে।
একদিকে যেমন, আপনি যদি দেখেন যে অ্যাপল কীভাবে তাদের সিঙ্গলটনের সংজ্ঞা দিচ্ছে, তারা এটি গ্রহণ করেছেন যে প্যাটার্নটি, উদাহরণস্বরূপ তাদের NSURLSession
সিঙ্গলটন নীচে সংজ্ঞায়িত করা হয়েছে:
@property (class, readonly, strong) NSURLSession *sharedSession;
আরেকটি, খুব গৌণ সুইফট আন্তঃযোগিতা বিবেচনা হ'ল সিঙ্গলটনের নাম। আপনি যদি এর পরিবর্তে প্রকারের নাম অন্তর্ভুক্ত করতে পারেন তবে এটি সর্বোত্তম sharedInstance
। উদাহরণস্বরূপ, ক্লাসটি যদি হয় তবে Foo
আপনি সিঙ্গলটন সম্পত্তি হিসাবে সংজ্ঞা দিতে পারেন sharedFoo
। অথবা ক্লাসটি থাকলে DatabaseManager
আপনি সম্পত্তিটি কল করতে পারেন sharedManager
। তারপরে সুইফ্ট ব্যবহারকারীরা এটি করতে পারেন:
let foo = Foo.shared
let manager = DatabaseManager.shared
স্পষ্টতই, আপনি যদি সত্যিই ব্যবহার করতে চান তবে আপনি sharedInstance
যে সুইফট নামটি চান তা সর্বদা ঘোষণা করতে পারেন:
@property (class, readonly, strong) Foo* sharedInstance NS_SWIFT_NAME(shared);
স্পষ্টতই, অবজেক্টিভ-সি কোড লেখার সময়, আমাদের সুইফট ইন্টারঅ্যাপেরিবিলিটি অন্য নকশাগুলির বিবেচনার চেয়ে বেশি হওয়া উচিত নয়, তবুও, যদি আমরা কোডটি লিখতে পারি যে উভয় ভাষাকে নিখুঁতভাবে সমর্থন করে, তবে এটি পছন্দনীয়।
আমি অন্যদের সাথে একমত পোষণ করেছি যে আপনি যদি এটি সত্যিকারের সিঙ্গলটন হতে চান যেখানে বিকাশকারীরা তাদের নিজস্ব দৃষ্টান্তগুলি (দুর্ঘটনাক্রমে) তাত্ক্ষণিকভাবে চালু করতে না পারে এবং না করতে পারে, তবে এটি unavailable
যোগ্যতা অর্জনকারী init
এবং new
বুদ্ধিমান।