Nə ARC-da bir elementli naxış tətbiq etmək üçün Apple dispatch_once istifadə etməyi məsləhət görür?

ARC altında təklənmək üçün paylaşılan bir nümunədə dispatch_once istifadə etmək üçün xüsusi səbəb nədir?

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

Arxa planda bir aslinxron yaratmaq pis bir fikirdir? Demək istərdim ki, bu paylaşılan nümunəni istəmirəm və dərhal ona etibar edirəm, amma öz müəllimi yaratmaq üçün Christmasdan əvvəl dispatch_once alırmı? Dərhal qayıtmayacaq? Ən azı bu, Böyük Mərkəzi Dispetçerin bütün nöqtəsi kimi görünür.

Niyə bunu edirlər?

288
02 февр. Proud üzvünə təyin olundu 02 Fevral. 2012-02-02 22:56 '12 at 10:56 pm 2012-02-02 22:56
@ 2 cavablar

dispatch_once() tamamilə sinxrondur. Bütün GCD metodları asinxron deyildir (halda, dispatch_sync() sinxrondur). dispatch_once() istifadə edərək, aşağıdakı deyimi əvəz edir:

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

dispatch_once() üstünlüyü, daha sürətli olmasıdır. Həm də semantik cəhətdən təminedicidir, çünki bu, siz də paylaşılan niyyətinizi təşviq etmək üçün funksiyanı yerinə yetirən bir çox mövzulardan qoruyur - əgər hamısı eyni zamanda çalışırsa. Bu, iki nümunənin yaradılmasına imkan verməyəcəkdir. dispatch_once() ideyası "bir dəfə və bir dəfə bir şey etmək" deməkdir.

403
02 февр. Cavab Kevin Ballard tərəfindən verilir 02 fevral. 2012-02-02 23:01 '12 at 23:01 2012-02-02 23:01

Çünki yalnız bir dəfə işləyəcək. Buna görə də, iki dəfə fərqli mövzulardan istifadə etməyə çalışarsanız, problem yaranmaz.

Mike Ash onun Blog Baxım və Yemək Singles tam bir təsviri var.

border=0

Bütün GCD blokları asynchronously başlamaz.

39
02 февр. Abizern tərəfindən verilmiş cavab 02 fevral. 2012-02-02 23:00 '12 saat 23:00 'da 2012-02-02 23:00

etiketləri ilə bağlı digər suallar və ya bir sual