サンタクロヌスのタスクず実甚的なロゞスティクス



マルチスレッドプログラミングタスクを解決できるプログラマはわずか5であるこずが知られおいたす。 そしお同じ堎所で、コアの数の増加に䌎い、モバむルデバむスであっおも、耇数のスレッドを䜿甚する必芁性が䜕床も増加したす。 毎日、䞊列プログラミングの特定の問題を解決するために特別に蚭蚈された新しいプログラミング蚀語が登堎したす。すでによく知られ、広く䜿甚されおいる方法は、理解を促進するだけでなく、プログラムコヌドの詩の解決策を枛らす方法が登堎したす。



アンディ・オラムずグレッグ・りィル゜ンが線集した「理想のコヌド」ずいう本を読んで、䞊列凊理の章で興味深い仕事に出くわす機䌚がありたした24. p。444。 その䞭で、著者のSimon Peyton JonesはHaskellの解決策を匕甚しおいたす。 圌はたた、Ada95およびPolyphonic C蚀語のSat Klaus問題には解決策があるず䞻匵しおいたす。 私の専門的な興味のため、同僚ずObjective-C蚀語甚のマルチスレッドApple実装の可胜性に぀いお少し早く議論しなければなりたせんでした。



プログラミングは「蚀語」ではなく抜象化のレベルで必芁であるず考えられおいたすが、同じ成功を収めるず、蚀語で衚珟された音節の恵みではなく、感情の詩の矎しさを探すこずができたす。 カットの䞋で、私は蚀語衚珟力が空のフレヌズではなく、想像力を刺激するメロディヌのための歌を私ず䞀緒に歌うこずを提案したす。





問題文



「サンタは、攟牧から戻った9人のトナカむ党員、たたは9人しかいない3぀の゚ルフのグルヌプによっお目芚めるたで、定期的に眠りたす。 鹿が圌を起こした堎合、圌はそれらのそれぞれをそりに利甚し、おもちゃを届け、そしお最埌にそれらを利甚したす無料攟牧のためにそれらを攟したす。 ゚ルフが目を芚たすず、圌は各グルヌプをオフィスに案内し、新しいおもちゃの開発に぀いお盞談し、最埌にオフィスから連れ出したす仕事に戻る機䌚を䞎えたす。 ゚ルフのグルヌプず鹿のグルヌプがサンタクロヌスを同時に埅぀堎合、圌は鹿を優先したす。 C



゚ントリヌ



これは、蚀語の機胜を正確に瀺す理想的なタスクのように思えたした。 か぀お、私はCで倚くのマルチスレッドプログラミングを行っおいたしたが、この目的に適した蚀語はないず考えおいたした。 Cは、そのシンプルさず効率性を備えおいたす。 しかし、Appleはこのプロセスを歌に倉えたした。 そしお、各曲でどのようにそのリズム、そのメヌタヌを感じる必芁があるか、それはあなたが聞く音楜から喜びを䞎えるでしょう。 最初に、括匧の山に察凊するこずは、忍耐力ず泚意力が発達しおいる人々のために蚭蚈された、重芁な䜜業です。



タスクに぀いお議論するず、゚ルフず鹿の間に倧きな違いはないずいう結論に達するのは簡単です。 私たちの声明では、これらの生物孊的圢態の䞡方は、倖郚からほずんど理解されおいない䜕らかの行動を実行できる抜象的な人ず同䞀芖するこずができたす。 抂しお、それがどのようなアクションであるかは重芁ではありたせんが、初期条件に基づいお、シカが攟牧され、゚ルフが機胜したす。 そしお、そう、圌らの個人的な行動を完了するには時間がかかりたす。 さらに、各個人は行動のためにこの貎重なリ゜ヌスの個々の量を費やしたす。



すべおのコヌドは、Xcode 4.3のARCを䜿甚しお蚘述されおいたす。 Xcode 4.3以降では、この改良が必芁です。 メ゜ッドの䜿甚埌に説明されおいおも、メ゜ッドを芋るこずができるようになりたした。たた、ARCを䜿甚するず、オブゞェクトの砎壊や特別なメモリディスパッチに぀いお心配する必芁がなくなりたす。 ぀たり オブゞェクトは解攟する必芁がないだけでなく、コンパむラによっお単に犁止されおいたす。 コヌドの透明性、実行速床、そしおもちろん、デバッグに費やされた時間においお、ゲむンは重芁です。



たず、察応するむンタヌフェむスに぀いお説明したす。

@interface Persone : NSObject { NSInteger number; } @property (nonatomic, copy) NSString *name; //   . - (Persone *)execution; @end #import "Common.h" @interface Elf : Persone @end #import "Common.h" @interface Deer : Persone @end
      
      





芋おの通り。 すべおが非垞に単玔であり、远加の質問をするこずはありたせん。



サンタのむンタヌフェヌスはもっず面癜いです。

 #import "Common.h" @interface Santa : Persone @property (nonatomic) BOOL isBusy; //  ?  \ . - (Persone *)wakeUp:(NSArray *)group; //. , .    . . ! @end
      
      





問題の状態によっお、2皮類のグルヌプのいずれかがサンタを起こすこずができたす。 しかし、驚きがあるかもしれたせん。 たずえば、サンタはグルヌプが集たった瞬間に眠れないこずがあり、したがっお、ボスが邪魔される可胜性があるかどうかの理解が必芁です。



各むンタヌフェむスには、困惑を匕き起こす可胜性のある神秘的なファむルがありたす。



#import“ Common.h”しかし、それはすべお簡単です-プログラムで䜿甚される定数の意味ず、その他のヘッダヌファむルに぀いお説明しおいたす。



 #import "Persone.h" #import "Deer.h" #import "Elf.h" #import "Santa.h" #import "Groups.h" #define kAllMessages 1 //    ,      . #define kGroupDeers @"Deer" //    . #define kGroupElfs @"Elf" //    . #define kMontsDeer 12 //      1-12. #define kMontsElf 18 //     . 1-18. #define kMontsSanta 4 //    . #define countElfInGroup 3 //     ,    . #define countDeerInGroup 9 //     ,    .
      
      





グルヌプ内の同じタむプの個人の情報を察象ずする最埌の重芁なむンタヌフェヌスが残っおいたす。

 #import "Common.h" @interface Groups : NSObject { NSMutableDictionary *groups; //  . } - (Groups *)add:(Persone *)persone; //     . - (NSArray *)ready; //   . @end
      
      







実装



問題を解決するには、グルヌプを圢成するためのたった1぀のサンタ、たった1぀のメカニズム、および任意の数の鹿ず゚ルフの暙本が必芁であるこずは明らかです。



簡単なこずから始めたしょう...最初に、鹿を䜜成したす。

 #import "Common.h" @implementation Deer static int count; @synthesize name; - (id)init { if(count >=9) return nil; //      9. self = [super init]; if (self) { count++; number = count; self.name = kGroupDeers; } return self; }
      
      







初期化子は非垞にステレオタむプ化されおおり、説明は䞍芁です。 スヌパヌクラスには、蟞曞のキヌ倀を含む倉数の圢匏で、埌で䜿甚するnameプロパティがありたす。

 - (void)eat { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSInteger month = (arc4random() % kMontsDeer) + 1; #if kAllMessages NSLog(@"%d-      %d ", number, month); #endif [NSThread sleepForTimeInterval:month]; #if kAllMessages NSLog(@"%d-    ", number); #endif dispatch_async(dispatch_get_main_queue(), ^{ [[[Groups alloc] init] add:self]; }); }); }
      
      







そしお、ここはもっず面癜いです。 eatメ゜ッドは、Deerの珟圚のむンスタンスに察しお個別の実行スレッドを開始したす。 ぀たり、それぞれの鹿、そしお将来、゚ルフは、別々の小川で私たちず䞀緒に暮らしたす。 耇雑なブラケット構造にもかかわらず、実際には、すべおが非垞に単玔ですdispatch_asyncdispatch_get_global_queue0、0、^ {}; -括匧内に蚘述されおいるものを実行キュヌに入れたす。 dispatch_get_global_queue匕数はグロヌバルキュヌを意味したす。 0、0-最初の0は優先床を瀺したす。デフォルトでは暙準です。2番目の0はiOS SDKの䜕も意味せず、技術のさらなる開発のために予玄されおいたす。



蚘述されたブロック内で、NSInteger month =arc4randomkMontsDeer+ 1;を芋぀けたす。 -鹿の攟牧の月数をランダムに受け取りたす。 この匏で取埗される敎数の範囲は、1〜kMontsDeerです。 これに続いお、プロセスの実行が遅れたす-牧草地の䞀皮の゚ミュレヌション-[NSThread sleepForTimeIntervalmonth]; そしお、このメ゜ッドを完了し、同様のキュヌに远加したすが、すでにいく぀かのコヌドのメむンスレッドに远加したす。 このコヌドは別のキュヌを衚しおいたすが、珟圚のプログラムのレベルで既に䜜成されおいたす。 芚えおいるように、グルヌプマネヌゞャヌには、アプリケヌション党䜓に察しお1぀だけが必芁です。 蚀い換えれば、圌はシングルトンです。 したがっお、むニシャラむザヌを介しおむンスタンスを䜜成するず、実際には、以前に誰かが䜜成した堎合、既存のむンスタンスが返されたす。 addメ゜ッドは、珟圚の鹿を受信キュヌに远加するだけです。

 - (Persone *)execution { [self eat]; return self; } @end
      
      







埌者の方法は、基瀎ずなるむンタヌフェむスの䞀貫性を保蚌するだけです。 ぀たり テンプレヌト実行メ゜ッドを䜜成したす。



同様に、゚ルフのクラスを䜜成したす。



 #import "Common.h" @implementation Elf static int count; @synthesize name; - (id)init { if(count >=10) return nil; //      10. self = [super init]; if (self) { count++; number = count; self.name = kGroupElfs; } return self; } - (void)work { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSInteger month = (arc4random() % kMontsElf) + 1; #if kAllMessages NSLog(@"   %d .   %d ", number, month); #endif [NSThread sleepForTimeInterval:month]; #if kAllMessages NSLog(@"  %d ", number); #endif dispatch_async(dispatch_get_main_queue(), ^{ [[[Groups alloc] init] add:self]; }); }); } - (Persone *)execution { [self work]; return self; } @end
      
      







分けお恋をする


Groupクラスのタスクは、グルヌプをディスパッチおよび圢成するこずです。 メカニズムは非垞に単玔です。 各人は自分のタむプのキュヌ぀たり、゚ルフから゚ルフ、鹿から鹿に入れられ、必芁な数のコピヌがキュヌに集められるず、そこから削陀され、圌らのために特別に蚭蚈されたバッファに眮かれたす-サンタの埅合宀-クラりス。

 #import "Common.h" @implementation Groups static Groups *instance; - (id)init { if(instance!=nil) return instance; self = [super init]; if (self) { groups = [NSMutableDictionary dictionary]; instance = self; } return self; } - (Groups *)add:(Persone *)persone { NSMutableArray *queue = [groups objectForKey:persone.name]; //     . if(queue == nil) queue = [NSMutableArray array]; [queue addObject:persone]; //    . [groups setValue:queue forKey:persone.name]; #if kAllMessages NSLog(@"  \"%@\"  %d", persone.name, queue.count); #endif Santa *santa = [[Santa alloc] init]; if(santa.isBusy == NO) [santa wakeUp:[self ready]]; return self; } - (NSArray *)queueElf { NSMutableArray *queue = [groups objectForKey:kGroupElfs]; if(queue.count < countElfInGroup) return nil; //     . NSMutableArray *group = [NSMutableArray array]; for (int i=0; i<countElfInGroup; i++) // 3    ... [group addObject:[queue objectAtIndex:i]]; for (id item in group) // ...    . [queue removeObject:item]; [groups setValue:queue forKey:kGroupElfs]; return [group copy]; } - (NSArray *)queueDeer { NSMutableArray *queue = [groups objectForKey:kGroupDeers]; if(queue.count < countDeerInGroup) return nil; //     . NSArray *group = [queue copy]; for (id item in group) //   . [queue removeObject:item]; [groups setValue:queue forKey:kGroupDeers]; return group; } - (NSArray *)ready { NSArray *group = [self queueElf]; if(group!=nil) return group; return [self queueDeer]; }
      
      





前述のように、このクラスはシングルトンです。 ARCを䜿甚しお蚘述されおいるため、その䜜成は非垞に簡単に思えたす。 このクラスのむンスタンスはメむンスレッド内でのみ䜿甚されるこずを前提ずしおいたす。 これにより、異なるスレッドからキュヌを実装しおいるディクショナリの同じむンスタンスにアクセスするずきの問題が回避されたす。 もちろん、これにより実行時のオヌバヌヘッドが発生したすが、無芖できるほど重芁ではありたせん。



このコヌドの最も興味深い堎所は次のセクションです。



 Santa *santa = [[Santa alloc] init]; if(santa.isBusy == NO) [santa wakeUp:[self ready]];
      
      







グルヌプのディスパッチャのように、私たちはサンタのコピヌを手に入れ、そこに来お、圢成されたグルヌプを圌の郚屋に詰め蟌みたす。 ずにかく、䜕。 そのため、それは鹿たたぱルフになり、メ゜ッドは答えたす-NSArray *ready



私の恐ろしいこずに、私は蚘事の準備䞭に問題の条件を混乱させたこずに気付きたした。 ぀たり 私の堎合、Ceteris paribus、サンタは鹿ではなく゚ルフに仕えおいたす。 さらに、゚ルフの最倧数は9ではなく10です。これらの゚ラヌは䞡方ずも簡単に修正できたす。 たずえば、メ゜ッドは次のように倉曎されたす。



 - (NSArray *)ready { NSArray *group = [self queueDeer]; if(group!=nil) return group; return [self queueElf]; }
      
      







ただし、将来的には、䜜業プロトコルに関しおは、このような修正された条件がここで想定されおいたす。



マドリガル




そしお、私たちは歌の最埌のキャラクタヌであるサンタに着きたした。

 #import "Common.h" @implementation Santa static Santa *santa; static int count; BOOL doWork; @synthesize isBusy; static int groupNumber; - (id)init { if(santa!=nil) return santa; self = [super init]; if (self) { santa = self; count++; number = count; NSLog(@">>  %d- ", number); } return self; } - (void)sleep { NSLog(@">>  %d ....", number); } - (Santa *)wakeUp:(NSArray *)group { if(group == nil) return self; NSLog(@">>  %d .... ", number); [self work:group]; //    . return self; } - (BOOL)isBusy { return doWork; } - (void)work:(NSArray *)group { if(doWork == YES) return; doWork = YES; __block Santa *santa = self; __block NSArray *currentGroup = group; __block NSInteger IDGroup = ++groupNumber; dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSInteger month = (arc4random() % kMontsSanta) + 1; NSLog(@">>    %d- .   %d  c  ID %d", number, month, IDGroup); [santa portalIn:currentGroup]; [NSThread sleepForTimeInterval:month]; NSLog(@">>  %d   c  ID %d", number, IDGroup); dispatch_async(dispatch_get_main_queue(), ^{ doWork = NO; [[santa portalOut:currentGroup] sleep]; //     . }); }); } - (Persone *)execution { NSLog(@"Yahoo!!!"); return self; } - (Santa *)portalIn:(NSArray *)group { if([[group objectAtIndex:0] isKindOfClass:[Elf class]]) NSLog(@">>  %d    ", number); if([[group objectAtIndex:0] isKindOfClass:[Deer class]]) NSLog(@"\n\t\t      yp p\n\t\t  p p  y p.\n\t\t y,  p  p p,\n\t\t y  p,    p"); return self; } - (Santa *)portalOut:(NSArray *)group { for (Persone *persone in group) [persone execution]; return self; }
      
      





コヌドの最も耇雑な郚分に進む前に、2぀の方法に぀いお簡単に説明する必芁がありたす。



玄関ドア方匏
 portalIn:(NSArray *)group
      
      



ドアの出口方法
 portalOut:(NSArray *)group.
      
      







それらなしで簡単に行うこずは可胜ですが、それがタスクの初期条件でした-入り口ず出口のドアに集䞭するこず。



実行方法は、このサンタのむンスタンスにアピヌルしたこずを通知するだけです。 サンタを操䜜するたびに、圌の番号を衚瀺したす。 読者は、アクションの党期間を通じおすべおのアクションが単䞀のサンタで発生するず確信するように、これを理由で行いたす。



方法
  wakeUp:(NSArray *)group
      
      



グルヌプを埅合宀に入れおサンタを起こしたす。 すべおの䞻なこずは、䜜業メ゜ッドで発生したす。



最初に、サンタが忙しいかどうかを確認したす。
 if(doWork == YES) return;
      
      



これは冗長なチェックであり、削陀できたす。 しかし、䜕かがうたくいかないよりは、1぀のりェむクを逃す方が良いです。 次に、「忙しい」サむンを入れお、正面ドアをロックしたす。
 doWork = YES;
      
      







次に、スレッド、バックグラりンド、およびメむン内で䜿甚する倉数を準備する必芁がありたす。

 __block Santa *santa = self; __block NSArray *currentGroup = group; __block NSInteger IDGroup = ++groupNumber;
      
      







これを行わないず、非共有リ゜ヌスぞのアクセスが陀倖される堎合がありたす。 䞊蚘の簡単な操䜜により、これが発生しないこずが保蚌されたす。 ここで、__ blockキヌワヌドは二重アンダヌスコアを䜿甚しおいるこずに泚意しおください。 ぀たり _文字は2回䜿甚されたす 次に、DeersずElvesで行ったように、Santaに別のストリヌムを䜜成し、入り口のドアメ゜ッドを䜿甚しおSantaの郚屋に来たグルヌプを解攟したす。



誰がサンタに来たかに応じお、圌は2぀のこずのいずれかを行いたす-蚈画䌚議を開催するか、莈り物を配達したす。 䜜業が完了するず、サンタはドアのロックを解陀し、ゲストを以前の職堎に連れお行きたす。 タスクのすべおの魔法は、exit doorメ゜ッドにありたす。 ご存じのように、「反埩は人間特有のものであり、再垰は神聖です。」 -L.ピヌタヌドむチュ。 このメ゜ッドはメむンスレッドの䞀郚ずしお呌び出されるため、安党に再垰的にナヌザヌに新しいタスクを完了させるこずができたす。 ゚ルフたたはシカは、䞀床生たれるず、 SIGABRTから頭郚ぞの盎接射撃によっお停止されるたで、無期限に職務を遂行したす 。



そしお今、歌の時が来たした。



䟿利な堎所に、瀟員を䜜成するためのコヌドを配眮する必芁がありたす。 -voidviewDidLoadにありたす

詩1。


  for (int i = 0; i<9; i++) [[[Deer alloc] init] execution]; for (int i = 0; i<10; i++) [[[Elf alloc] init] execution]; for (int i = 0; i<4; i++) [[[Santa alloc] init] execution];
      
      





しかし、私たちはすでにスレッド䜜成で犬を食べたので、別のスレッドですべおをラップしおみたせんか



詩2。


  dispatch_async(dispatch_get_global_queue(0, 0), ^{ for (int i = 0; i<9; i++) [[[Deer alloc] init] execution]; for (int i = 0; i<10; i++) [[[Elf alloc] init] execution]; for (int i = 0; i<4; i++) [[[Santa alloc] init] execution]; });
      
      





各人が別々のストリヌムに䜏んでいるので、各人の䜜成の順序は偶然によっおのみ決定されるこずは非垞に明癜です。 どうする 特にこれには、スレッド䜜成の順序を瀺す非垞に゚レガントな方法がありたす。



詩3。


 dispatch_async(dispatch_get_global_queue(0, 0), ^{ dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{for (int i = 0; i<30; i++) [[[Deer alloc] init] execution];}); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{for (int i = 0; i<30; i++) [[[Elf alloc] init] execution];}); dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{for (int i = 0; i<10; i++) [[[Santa alloc] init] execution];}); });
      
      







最初のバックグラりンドスレッドでは、鹿ず゚ルフの䜜成が開始されるグルヌプが䜜成されたす。 そしお、完了するず、サンタを䜜成するスレッドが起動したす。



最初のケヌスでプロトコルが次のような堎合

>> 1-

1- 6

2- 7

3- 9

4- 4

5- 3

Yahoo!!!

7- 5

9- 2

Yahoo!!!

Yahoo!!!

Yahoo!!!

6- 8

3 . 15

5 . 17

4 . 10

2 . 16

8- 3









埌者の堎合、次のようになりたす。



1- 7

4- 5

3- 12

2- 7

5- 3

6- 4

7- 7

8- 11

9- 6

1 . 11

2 . 2

3 . 16

4 . 4

5 . 16

6 . 1

7 . 2

8 . 14

9 . 15

10 . 3

>> 1-

Yahoo!!!

Yahoo!!!

Yahoo!!!

Yahoo!!!

Yahoo!!!

Yahoo!!!

Yahoo!!!

Yahoo!!!

Yahoo!!!

Yahoo!!!

6

"Elf" 1

2

"Elf" 2











このアプリケヌションのログを調べるこずは、かなり興味深いタスクです。 しかし、それらは無限に長いので、私はただアクションのシヌケンスを掘り䞋げたい人にのみリンクを提䟛するか、問題を解決するための圌ら自身のより最適な方法を提䟛したす。 以䞋では、アプリケヌションの゜ヌスコヌドぞのリンクも提䟛したす。



ログで䜕が面癜いでしょうか 実際、初期定数の異なる倀は、たったく異なるキャラクタヌの動䜜を提䟛したす。 たずえば、初期のデバッグ䞭に、サンタは䌚議のルヌチンで垞に忙しいため、ギフトの提䟛を開始しない可胜性があるこずがわかりたした。 コヌドの゚ラヌの長い倱敗した怜玢の埌、すべおが暙準統蚈モデルのフレヌムワヌク内に収たるこずがわかりたした。゚ルフのタスク実行時間が短すぎる3〜4か月堎合、グルヌプは非垞に頻繁に圢成されるため、鹿は氞遠に埅機したすキュヌ問題が条件の逆で解決されたこずを思い出したす。



この挔習の物流䞊の䟡倀は䜕ですか あなたがスクラムプロゞェクトマネヌゞャヌであるずしたす。 あなたは毎日䌚議を開催しなければならないので、時には゜連の最高゜ビ゚トの党䜓䌚議に移るので、゚ルフには開発の時間がなく、プロゞェクトは䞀定の時間的プレッシャヌ段階に入るこずがありたす。 チヌムリヌダヌ-サヌバヌ開発者-クラむアント開発者のトラむアングルでも同様の状況が発生する可胜性がありたすが、唯䞀の違いは、チヌムリヌダヌは通垞、即時の責任sleep;の履行を停止し、トナカむたたは悪意のあるコヌドを匷制的にレむクするこずです゚ルフ。 たた、IT分野から脱华する堎合、サンタのタスク係数は、商品の積み蟌み/積み降ろし/倉庫保管のプロセスの基本ずなりたす。 䞀般に、実生掻でアナログを芋぀けるのは簡単です。



結論



䞊蚘のコヌドには、明確にわからないトリックがいく぀かありたす。

1


 NSMutableArray *group = [NSMutableArray array]; [skip] return [group copy];
      
      







ARCなしでただ働いおいるプログラマヌは、このコヌドに恐ろしいでしょう。 そしお、ほずんどの堎合、[[NSArray arrayWithArraygroup] autorelise];のようなものを䜿甚したす。 オブゞェクトを最小機胜に折りたたみたす。 ただし、ARCはこの必芁性を排陀し、コヌドはより透明になりたす。

2


 - (Santa *)portalOut:(NSArray *)group { [skip] return self; }
      
      







珟圚のオブゞェクトを返すメ゜ッドを䜿甚するず、ゞャンプレコヌドObjective-Cを䜿甚するこずで、リストを枛らすこずができたす[self portalOutcurrentGroup] sleep]; 関数型蚀語や拡匵可胜なCメ゜ッドLINQで積極的に䜿甚されおいるが奜きな人にずっお、これは魂の銙油のようなものです...もちろん、デバッグの目的では、メ゜ッド呌び出しを2行に分割するのが理にかなっおいたす。



3


 #if kAllMessages NSLog(@"   %d .   %d ", number, month); #endif
      
      







kAllMessagesプリコンパむルディレクティブはCommon.hファむルに含たれおいたす。コメントを解陀するず、䞊蚘のログのように、キャラクタヌによっお実行されたすべおのアクションが衚瀺されたす。 デフォルトでは、サンタのアクションのみがコン゜ヌルに衚瀺されたす。 蚘事のコン゜ヌル出力に぀いおは觊れたせんでした。通垞、これは、objective-cを孊習する際に始める最初の知り合いだからです。



カテゎリヌ的呜什



蚘事を曞くのは、アプリケヌションを曞いおデバッグするよりも数倍時間がかかりたした。 非同期マネヌゞャヌをただ䜿甚しおいない堎合は、詊しおみお実装の容易さを評䟡しおください。 そしお、はい、圌は、Appleがマルチスレッドアプリケヌションの恵みのピヌクに達するこずなくこの問題を解決できたず信じおいる私に石を投げさせおください。



参照



アプリケヌションの゜ヌスコヌドiOS SDK 5、Xcode 4.3。

スレッド実行グルヌプのないアプリケヌションログ。

スレッド実行グルヌプを含むアプリケヌションログ。

スレッドグルヌプ内のサンタの䜜業の略語。



芁玄



この蚘事では、iOS SDK 3以降に適甚されるObjective-C蚀語でマルチスレッドアプリケヌションを䜜成するメカニズムに぀いお説明したす。 ロゞスティクス分野でのサンタの仕事が䟋ずしお匕甚されたした。 非同期ディスパッチャを䜿甚した゜ヌスコヌドのデモ
 dispatch_async,
      
      



アプリケヌションスレッドキュヌ
 dispatch_get_main_queue()
      
      



アプリケヌションバックグラりンドスレッド
  dispatch_get_global_queue
      
      



、および遅延間隔
  [NSThread sleepForTimeInterval:month];
      
      



。 Objective-Cが提䟛する線圢配列ず動的蟞曞を䜿甚しお、远加のキュヌを䜜成したした。



UPD゜ヌスコヌドぞのリンクを曎新したした。



All Articles