self.simpleOperation = [NSBlockOperation blockOperationWithBlock: ^{
NSLog(@"Main Thread = %@", [NSThread mainThread]);
NSLog(@"Current Thread = %@", [NSThread currentThread]);
NSUInteger counter = 0;
for (counter = 0;
counter < 1000;
counter++){
NSLog(@"Count = %lu", (unsigned long)counter);
}
}];
/* ΠΠ°ΠΏΡΡΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. */
[self.simpleOperation start];
/* ΠΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ, ΠΏΡΠΎΡΡΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ,
Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΌΡ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ, ΠΏΠΎΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΈΠ»ΠΈ Π½Π΅Ρ.*/
NSLog(@"Main thread is here");
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π½Π° ΡΠΊΡΠ°Π½Π΅ Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ 0 Π΄ΠΎ 999, Π° Π·Π° Π½ΠΈΠΌΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Main thread is here (ΠΡΠΎ Π³Π»Π°Π²Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ):
Main Thread = <NSThread: 0x68 10280>{name = (null), num = 1}
Current Thread = <NSThread: 0x68 10280>{name = (null), num = 1}
β¦
Count = 991
Count = 992
Count = 993
Count = 994
Count = 995
Count = 996
Count = 997
Count = 998
Count = 999
Main thread is here
ΠΡΠ°ΠΊ, ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±Π»ΠΎΠΊΠΎΠ²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π±ΡΠ»Π° Π·Π°ΠΏΡΡΠ΅Π½Π° Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ application: didFinishLaunchingWithOptions:, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅, ΠΊΠΎΠ΄ Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ· ΡΡΠΈΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ (Π»ΠΎΠ³ΠΎΠ²), ΡΠ²ΠΎΠ΄ΡΡΡΡ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ: ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π»Π° Π³Π»Π°Π²Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»Π° Π·Π°Π²Π΅ΡΡΠ΅Π½Π° ΡΠ°Π±ΠΎΡΠ° Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠΎ ΠΎΠ±ΡΠ°Π·Π΅Ρ ΠΎΡΠ΅Π½Ρ Π½Π΅ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Ρ iOS, Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠ΄ΡΠΈ Π½Π° Π»ΡΠ±ΡΠ΅ ΡΠ»ΠΎΠ²ΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π»ΡΠ±ΡΠΌΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌΠΈ ΠΈΠΌ ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌΠΈ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΎΡΠΊΠ»ΠΈΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈ ΡΡΠΎΠ±Ρ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠ³ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ Π΄Π΅Π»ΠΎΠΌ β ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°. ΠΠΎΡ ΡΡΠΎ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΈΡΠ΅Ρ Apple.
Β«ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ Π²Ρ ΡΠ΅ΡΠ°Π΅ΡΠ΅ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΌΠ΅Π½Π½ΠΎ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΡ ΠΊΠ°ΡΠ°Π½ΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄. Π§ΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΠ»ΠΈΠΊΠ°ΡΡΡΡ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π³Π»Π°Π²Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠ»Π³ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π·Π°Π΄Π°Ρ Π»ΠΈΠ±ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Ρ Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΊΠΎΠ½ΡΠΎΠΌ. Π’Π°ΠΊΠΎΠ²Ρ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π·Π°Π΄Π°ΡΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΡΠ΅ΡΠΈ. ΠΠ°ΠΏΡΠΎΡΠΈΠ², ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ°ΡΡ Π² ΡΠΎΠ½ΠΎΠ²ΡΡ ΠΏΠΎΡΠΎΠΊΠ°Ρ . ΠΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΈΡ Π·Π°Π΄Π°Ρ β Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΡ Π² ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈ ΡΠ°ΠΌΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ Π²ΡΡΡΠ½ΡΡΒ».
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΡΠ° ΡΠ΅ΠΌΠ° ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ Performance Tuning (Β«ΠΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈΒ») Π² ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ iOS. ΠΠΎΠΊΡΠΌΠ΅Π½Ρ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html#//apple_ref/doc/uid/TP400 07072-CH8-SW1.
ΠΡΠΎΠΌΠ΅ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΡ ΠΎΡ NSOperation ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π²Π°ΡΡ Π·Π°Π΄Π°ΡΡ Π² ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅. ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΡ ΠΊ ΡΠ°Π±ΠΎΡΠ΅, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠ°Π½ΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΡ NSOperation.
ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ, ΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΊΡΠ΅ΠΏΠΈΡΡ ΠΎΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ start, ΠΎΡΠ½ΠΎΡΡΡΠ΅ΠΌΡΡ ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠΌΠΈ Π²ΡΡΡΠ½ΡΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ main ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ start.
Π ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΄Π²Π° Π²Π°ΠΆΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° NSOperation β ΠΌΠ΅ΡΠΎΠ΄Ρ isExecuting ΠΈ isFinished. ΠΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. Π ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π°Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Β«ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Π΅ΠΉ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π°Ρ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°Β» (KVO) ΡΠΎΠΎΠ±ΡΠ°ΡΡ Π²ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°ΡΠ΅Π»ΡΠΌ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π΄Π²ΡΡ ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Ρ ΠΊΠΎΠ΄ΠΎΠΌ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅.
Π ΠΌΠ΅ΡΠΎΠ΄Π΅ main, ΠΎΡΠ½ΠΎΡΡΡΠ΅ΠΌΡΡ ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌΡΠΉ ΠΏΡΠ» Π½Π° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΠ±ΠΎΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ β ΠΊΠ°ΠΊ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π²ΡΡΡΠ½ΡΡ, ΡΠ°ΠΊ ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ.
Π£ Π²Π°Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄-ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ Π΄Π»Ρ Π²Π°ΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. ΠΡΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ. ΠΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ-ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ init, Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΡΡΠ³ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ-ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ-ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΡ (Π΅ΡΠ»ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ).
ΠΠΎΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (.h-ΡΠ°ΠΉΠ»):
#import <Foundation/Foundation.h>
@interface CountingOperation: NSOperation
/* ΠΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ */
β (id) initWithStartingCount:(NSUInteger)paramStartingCount
endingCount:(NSUInteger)paramEndingCount;
@end
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΠ°Ρ Π². m-ΡΠ°ΠΉΠ»Π΅) Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π»ΠΈΠ½Π½ΠΎΠ²Π°ΡΠ°, Π½ΠΎ, Π½Π°Π΄Π΅ΡΡΡ, Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½Π°:
#import Β«CountingOperation.hΒ»
@implementation CountingOperation
@property (nonatomic, unsafe_unretained) NSUInteger startingCount;
@property (nonatomic, unsafe_unretained) NSUInteger endingCount;
@property (nonatomic, unsafe_unretained, getter=isFinished) BOOL finished;
@property (nonatomic, unsafe_unretained, getter=isExecuting) BOOL executing;
@end
@implementation CountingOperation
β (instancetype) init {
return([self initWithStartingCount:0
endingCount:1000]);
}
β (instancetype) initWithStartingCount:(NSUInteger)paramStartingCount
endingCount:(NSUInteger)paramEndingCount{
self = [super init];
if (self!= nil){
/* Π‘ΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ ΡΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°. */
startingCount = paramStartingCount;
endingCount = paramEndingCount;
}
return(self);
}
β (void) main {
@try {
/* ΠΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌΡΠΉ ΠΏΡΠ». */
@autoreleasepool {
/* Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π·Π΄Π΅ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ
Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² YES Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π°
ΠΌΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ. */
BOOL taskIsFinished = NO;
/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π·Π΄Π΅ΡΡ ΡΠΈΠΊΠ» while, ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ Π»ΠΈΡΡ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅,
ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ taskIsFinished ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² YES
ΠΈΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΡΠΌΠ΅Π½ΡΠ΅ΡΡΡ. */
while (taskIsFinished == NO &&
[self isCancelled] == NO){
/* ΠΠ΄Π΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π·Π°Π΄Π°ΡΠ°. */
NSLog(@"Main Thread = %@", [NSThread mainThread]);
NSLog(@"Current Thread = %@", [NSThread currentThread]);
NSUInteger counter = startingCount;
for (counter = startingCount;
counter < endingCount;
counter++){
NSLog(@"Count = %lu", (unsigned long)counter);
}
/* ΠΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ. ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠΉΡΠΈ ΠΈΠ· ΡΠΈΠΊΠ»Π°, ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ
ΡΠΎΠ±Π»ΡΠ΄Π°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΡΠΌΠ΅Π½ΡΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. */
taskIsFinished = YES;
}
/* Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ KVO. ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ KVO. */
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"];
finished = YES;
executing = NO;
[self didChangeValueForKey:@"isFinished"];
[self didChangeValueForKey:@"isExecuting"];
}
}
@catch (NSException * e) {
NSLog(@"Exception %@", e);
}
}
@end
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΠ°ΡΡ ΡΠ°ΠΊ:
@interface AppDelegate ()
@property (nonatomic, strong) CountingOperation *simpleOperation;
@end
@implementation AppDelegate
β (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.simpleOperation = [[CountingOperation alloc] initWithStartingCount:0
endingCount:1000];
[self.simpleOperation start];
NSLog(@"Main thread is here");
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
@end
ΠΠ°ΠΏΡΡΡΠΈΠ² Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π² ΠΎΠΊΠ½Π΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, ΡΠΎΡΠ½ΠΎ ΠΊΠ°ΠΊ ΠΏΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ: