Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 73

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

β€’ ΠœΠ°Ρ€ΠΊΠ΅Ρ€ β€” ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ Ρ‚ΠΈΠΏΠ° dispatch_once_t, содСрТащий ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ GCD ΠΌΠ΅Ρ‚ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π°. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ лишь ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ активизируСтся Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π’Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΡ‹ вскорС рассмотрим.

 Π‘Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, выполняСмый Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. Π‘Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

dispatch_once всСгда выполняСт свою Π·Π°Π΄Π°Ρ‡Ρƒ Π² Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ². Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ, Ρ‚Π°ΠΊ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ ΠΈΠ»ΠΈ главная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

НапримСр:


static dispatch_once_t onceToken;


void (^executedOnlyOnce)(void) = ^{


static NSUInteger numberOfEntries = 0;

numberOfEntries++;

NSLog(@"Executed %lu time(s)", (unsigned long)numberOfEntries);


};


β€” (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


dispatch_queue_t concurrentQueue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


dispatch_once(&onceToken, ^{

dispatch_async(concurrentQueue,

executedOnlyOnce);

});


dispatch_once(&onceToken, ^{

dispatch_async(concurrentQueue,

executedOnlyOnce);

});


self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];


self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;


}


Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΌΡ‹ пытаСмся Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ executedOnlyOnce Π΄Π²Π°ΠΆΠ΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dispatch_once, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ GCD выполняСт этот Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ лишь ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dispatch_once, ΠΎΠ±Π° Ρ€Π°Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅.

Π’ руководствС Cocoa Fundamentals Guide (Руководство ΠΏΠΎ основам Cocoa) (https://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html) Apple ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ синглтон. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ довольно старый ΠΈ Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ использования GCD ΠΈ автоматичСского подсчСта ссылок. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эту модСль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ GCD ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ dispatch_once. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ смоТСм ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:


#import Β«MySingleton.hΒ»


@implementation MySingleton


β€” (instancetype) sharedInstance{

static MySingleton *SharedInstance = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

SharedInstance = [MySingleton new];

});

return SharedInstance;

}


@end

7.9. ОбъСдинСниС Π·Π°Π΄Π°Ρ‡ Π² Π³Ρ€ΡƒΠΏΠΏΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GCD

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

ВрСбуСтся ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° Π² Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ GCD Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ всС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ΄Π½Ρƒ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, выстраивая Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ.

РСшСниС

Для создания Π³Ρ€ΡƒΠΏΠΏ Π² GCD ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ dispatch_group_create.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

GCD позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡ‹. ΠŸΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ нСсколько Π·Π°Π΄Π°Ρ‡ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΡ… всС, Π° ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ± этом ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ GCD. Вакая тСхнология ΠΈΠΌΠ΅Π΅Ρ‚ большоС ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Допустим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ интСрфСйсом ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² этом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ интСрфСйсС. Π’ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ интСрфСйсС Ρƒ вас имССтся Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄, ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Π²ΠΈΠ΄ ΠΈ Π²ΠΈΠ΄ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ содСрТимоС этих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:


β€” (void) reloadTableView{

/* Π—Π΄Π΅ΡΡŒ пСрСзагруТаСтся Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄. */

NSLog(@"%s", __FUNCTION__);

}


β€” (void) reloadScrollView{

/* Π—Π΄Π΅ΡΡŒ выполняСтся Ρ€Π°Π±ΠΎΡ‚Π°. */

NSLog(@"%s", __FUNCTION__);

}


β€” (void) reloadImageView{

/* Π—Π΄Π΅ΡΡŒ пСрСзагруТаСтся Π²ΠΈΠ΄ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. */

NSLog(@"%s", __FUNCTION__);

}


На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ пусты, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ·ΠΆΠ΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Π½ΠΈΡ… Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, связанный с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ интСрфСйсом. БСйчас ΠΌΡ‹ собираСмся Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ эти Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° GCD Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΌΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Для этого Π½Π°ΠΌ придСтся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Π² GCD Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ прСдставлСниС ΠΎ Ρ‚Ρ€Π΅Ρ… функциях:

β€’ dispatch_group_create β€” создаСт ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Π³Ρ€ΡƒΠΏΠΏΡ‹;

β€’ dispatch_group_async β€” отправляСт Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° Π² Π³Ρ€ΡƒΠΏΠΏΡƒ для выполнСния. НСобходимо ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΡΠΊΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ этот Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π³Ρ€ΡƒΠΏΠΏΡƒ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ этот Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° относится;

β€’ dispatch_group_notify β€” позволяСт ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС Π·Π°Π΄Π°Ρ‡ΠΈ, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ для выполнСния, Π·Π°ΠΊΠΎΠ½Ρ‡Π°Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π­Ρ‚Π° функция Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΡΠΊΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Как объяснялось Ρ€Π°Π½Π΅Π΅, Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ собираСмся Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ reloadTableView, reloadScrollView ΠΈ reloadImageView ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ сообщСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°. Для достиТСния этой Ρ†Π΅Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΌΠΎΡ‰Π½Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, присущиС GCD:


β€” (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

dispatch_group_t taskGroup = dispatch_group_create();

dispatch_queue_t mainQueue = dispatch_get_main_queue();


/* ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄ Π² Π³Π»Π°Π²Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. */

dispatch_group_async(taskGroup, mainQueue, ^{

[self reloadTableView];

});


/* ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Π²ΠΈΠ΄ Π² Π³Π»Π°Π²Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. */

dispatch_group_async(taskGroup, mainQueue, ^{

[self reloadScrollView];

});


/* ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π²ΠΈΠ΄ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² Π³Π»Π°Π²Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. */

dispatch_group_async(taskGroup, mainQueue, ^{

[self reloadImageView];

});


/* ΠšΠΎΠ³Π΄Π° всС это Π±ΡƒΠ΄Π΅Ρ‚ сдСлано, диспСтчСризуСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ. */

dispatch_group_notify(taskGroup, mainQueue, ^{

/* Π—Π΄Π΅ΡΡŒ происходит ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. */

[[[UIAlertView alloc] initWithTitle:@"Finished"

message:@"All tasks are finished"

delegate: nil

cancelButtonTitle:@"OK"

otherButtonTitles: nil, nil] show];


});


self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}


ΠšΡ€ΠΎΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ dispatch_group_async, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ асинхронныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° языкС C, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dispatch_group_async_f.

GCDAppDelegate β€” это просто имя класса, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ взят ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π”Π°Π½Π½ΠΎΠ΅ имя класса ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для привСдСния Ρ‚ΠΈΠΏΠ° контСкстного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятор ΠΏΠΎΠ½ΠΈΠΌΠ°Π» наши ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ:


void reloadAllComponents(void *context){


AppDelegate *self = (__bridge AppDelegate *)context;

[self reloadTableView];

[self reloadScrollView];

[self reloadImageView];


}


β€” (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


dispatch_group_t taskGroup = dispatch_group_create();

dispatch_queue_t mainQueue = dispatch_get_main_queue();


dispatch_group_async_f(taskGroup,

mainQueue,

(__bridge void *)self,

reloadAllComponents);


/* ΠšΠΎΠ³Π΄Π° всС это Π±ΡƒΠ΄Π΅Ρ‚ сдСлано, диспСтчСризуСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ. */

dispatch_group_notify(taskGroup, mainQueue, ^{

/* Π—Π΄Π΅ΡΡŒ происходит ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. */

[[[UIAlertView alloc] initWithTitle:@"Finished"

message:@"All tasks are finished"

delegate: nil

cancelButtonTitle:@"OK"

otherButtonTitles: nil, nil] show];


});


self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];


self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция dispatch_group_async_f ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° языкС C ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° для исполнСния, Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ссылка Π½Π° self, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΌΠΎΠ³Π»Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ экзСмпляра Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π³Π΄Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° функция C. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ self пСрСдаСтся ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ контСкста Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dispatch_group_async_f. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ контСкстах ΠΈ функциях C рассказано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 7.4.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ всС поставлСнныС Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, ΠΊΠ°ΠΊ Π½Π° рис. 7.3.


Рис. 7.3. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ Π·Π°Π΄Π°Ρ‡ Π² GCD

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

Π Π°Π·Π΄Π΅Π» 7.4.