ios - এআরসি এর অধীনে একক্টন প্যাটার্ন বাস্তবায়নের জন্য অ্যাপল dispatch_once ব্যবহার করার পরামর্শ দেয় কেন?




objective-c singleton (2)

কারণ এটি শুধুমাত্র একবার চালানো হবে। সুতরাং আপনি বিভিন্ন থ্রেড থেকে দুবার চেষ্টা এবং অ্যাক্সেস যদি এটি একটি সমস্যা হবে না।

মাইক এশ সিঙ্গলন ব্লগ পোস্টের কেয়ার অ্যান্ড ফিডিংয়ে পূর্ণ বিবরণ দিয়েছেন।

সব জিসিডি ব্লক অস্তিত্বহীনভাবে চালানো হয় না।

ARC এর অধীনে একটি এককন্টনের ভাগ করা ইনস্ট্যান্স অ্যাক্সেসারে dispatch_once ব্যবহার করার সঠিক কারণ কী?

+ (MyClass *)sharedInstance
{
    //  Static local predicate must be initialized to 0
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

ব্যাকগ্রাউন্ডে অবিচ্ছিন্নভাবে সিঙ্গল্টকে তাত্ক্ষণিকভাবে চালু করা কি খারাপ ধারণা নয়? আমি যদি ভাগ করে নেওয়ার অনুরোধের অনুরোধ করি এবং তা অবিলম্বে নির্ভর করি তবে কি ঘটতে পারে তবে dispatch_once ক্রিসমাসটি আমার অবজেক্ট তৈরি না হওয়া পর্যন্ত কী হবে? এটা কি অবিলম্বে ফিরবে না? অন্তত যে গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচ পুরো বিন্দু বলে মনে হচ্ছে।

তাহলে তারা কেন এটা করছে?


dispatch_once() একেবারে সিঙ্ক্রোনাস। সমস্ত জিসিডি পদ্ধতি অস্তিত্বহীনভাবে কাজ করে না (বিন্দু ক্ষেত্রে, dispatch_sync() সমান হয়)। dispatch_once() ব্যবহার নিম্নলিখিত idiom প্রতিস্থাপন করে:

+ (MyClass *)sharedInstance {
    static MyClass *sharedInstance;
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[MyClass alloc] init];
        }
    }
    return sharedInstance;
}

dispatch_once() এর সুবিধাটি এটি দ্রুত। এটি সেমেটিক্যাল ক্লিনারও, কারণ এটি আপনাকে আপনার ভাগ করা ইনস্ট্যান্সের সমস্ত ইনট-এ কাজ করে একাধিক থ্রেড থেকেও রক্ষা করে - যদি তারা একই সময়ে সঠিক সময়ে চেষ্টা করে। এটা দুই দৃষ্টান্ত তৈরি করা যাবে না। dispatch_once() এর সম্পূর্ণ ধারণা "একবার একবার এবং একবার একবার সঞ্চালন করুন", যা আমরা ঠিক করছি।





automatic-ref-counting