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のメモリ管理とマルチスレッド?
- 作者: 坂本一樹
- 出版社/メーカー: インプレスジャパン
- 発売日: 2011/11/18
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 343回
- この商品を含むブログ (22件) を見る