yashiganiの英傑になるまで死ねない日記

週末はマスターバイクでハイラルを走り回ります

GCD すごい

iOS には,iOS4.0 から GCD っていう非同期処理の仕組みが入ったんだけど,今までこれという活かしどころがなくて使っていなかった
ちょうどいい感じの活かしどころが出てきたのでここぞとばかりに試してみた.


音楽再生するアプリで自分の iPod Library からリストに上がっている曲を探してくるんだけど,これが 50 コくらい探そうと思うと結構な量の曲数が入っているライブラリとか,3GS だとむっちゃ時間がかかって画面の遷移に挟んだりすると,とてもじゃないけど精神衛生に支障をきたすレベルのロックがかかる(5~20秒くらい)

こんなかんじ

for (NSString *title in titles) {
    MPMediaPropertyPredicate *titlePredicate =
        [MPMediaPropertyPredicate predicateWithValue:title
                                         forProperty:MPMediaItemPropertyTitle 
                                      comparisonType:MPMediaPredicateComparisonContains];
    [queries addObject:[[[MPMediaQuery alloc] initWithFilterPredicates:[NSSet setWithObject:titlePredicate]] autorelease]];
}

これを GCD でさらっと

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL);
dispatch_group_t group = dispatch_group_create();
for (NSString *title in titles) {
    dispatch_group_async(group, queue, ^{
        MPMediaPropertyPredicate *titlePredicate =
            [MPMediaPropertyPredicate predicateWithValue:title
                                             forProperty:MPMediaItemPropertyTitle 
                                          comparisonType:MPMediaPredicateComparisonContains];
        [queries addObject:[[[MPMediaQuery alloc] initWithFilterPredicates:[NSSet setWithObject:titlePredicate]] autorelease]];
    });
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    [self postNotification];
});
dispatch_release(group);


コードの構成にほとんど変更無いのに非同期処理になってマジでスゲェ.


ザ・並列処理って感じのパターンで非常に爽快やった.
教科書的な処理が実際に出てくるってのは,イイネ!


エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?

エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?