さらに今更ながら、ASCII.jpさんの「マルチコア時代の新機軸! Snow LeopardのGCD」に、わりと一般向けの説明から始まって、コードを使用したプログラマ向けの説明までしているページがあ…
さらに今更ながら、ASCII.jpさんの「マルチコア時代の新機軸! Snow LeopardのGCD」に、わりと一般向けの説明から始まって、コードを使用したプログラマ向けの説明までしているページがあ…
鸟归巢:夜趣福利导第一导航|性交描述小说|男人插曲女视频40分钟|影音先峰男人资源,一部不行就来两部,身体要紧且看且珍惜。
「Objective-Cで非同期処理を同期処理にする方法。」に、ディスパッチセマフォによってスレッドがデッドロックしてしまう場合があるということを書きました。 デッドロックする例 これがその例です。 NSLog(@"start."); dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ for (int i = 0; i < 5; i++) { sleep(1); NSLog(@"Process: %d", i); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"Main Process"); }
dispatch_queue_create(@"キュー名", DISPATCH_QUEUE_CONCURRENT);
iPhoneでもiOS4以降サポートされたGrand Central Dispatchを使うと、マルチスレッドを使ったプログラムが簡単に作れます。WWDC 2010のビデオ(#206, #211) を見て何となく判った気になったのですが、まだクリアでない点があったので自分でコードを書いてみました。 私の理解では、Grand Central Dispatch(GCD)はには マルチプロセッサを有効に使える、並列プログラムを簡単に書ける 操作性を高める、並行処理を簡単に書ける の2つの目的があると思います。ここでは 2. に付いて書きます。 1.については Wikipediaの The second exampleが参考になると思います。 今回のサンプル ここでは、Twitterのpublic timelineを取得し、つぶやきとアイコンを表示するプログラムを、スレッドをまったく使わないコード
以前は NSObject の - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait などを利用していた。 引数が0または1しか取れない、メソッドをわざわざ作る必要がある、など不便な点が多かった。引数増やすときは NSInvocation で回避できたが、やっぱり面倒だった。 GCD を使ったほうが簡単。 同期実行したいときは dispatch_async() の代わりに dispatch_sync() を使う。 Main thread から dispatch_sync で main queue に突っ込もうとすると誰も処理できずに詰まるので注意。 どの thread から呼ばれるかわからない場合は自分がどの thread にいるかチェックする。 (もっと良
http://cocoatouch.sblo.jp/article/26626578.html みたいなことをGCD+Blocksでやってみた記録。コメントは間違っているかもしれない。実際のコードの抜粋で、tableView:cellForRowAtIndexPath:内のコードである。itemSpecはNSDictionaryであり、Amazonから引っ張った商品データや画像URLが入っている。 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // (中略。cellの準備や再利用コード) // 表示すべきデータの読み込み NSMutableDictionary *itemSpec = [search_results object
はじめまして!iOSのプログラム書いたり、perlを書いたりと色々している@Maco_Tasuです。 このエントリは tech.kayac.com Advent Calendar 2012 の17日目の記事です。 この2012年は、卒業制作関係でIllustratorを使ったり、企画をひたすら考えたりと多様多種に渡る仕事をした年だったなと思います。 今年のAdvent Calenderのテーマが「私の中のマイイノベーション」ということで、今年、今更ながら知ったGCDについてご紹介したいと思います。 GCD GCDとは正式名称が grand central dispatchというものでiOS4から導入されたマルチスレッドプログラミングを実現するための技術です。 このGCDが導入される以前からiOSではperformSelectorやNSThreadなどのマルチスレッドプログラミングの方法がも
block blockはコード中のブロックのこと. caretと呼ばれる”^”から始まる. 関数外のローカル変数を使えるがread only. が,ローカル変数を __blockをつけて宣言していれば,書き換えることも可能. e.g. __block BOOL something = NO; こうするとブロック内でYESに書き換えられる. typedefすると便利. double型の引数を1つとり,返り値がdoubleであるブロックオブジェクトの型に unary_opeartion_tをつけるには次のようにする. typedef double (^unary_opeartion_t)(double op); そうすると, unary_operation_t square; square = ^(double operand) { return operand * opera
+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:] が何をしているか調べてみた TL; DR: +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:] は dispatch_async で +[NSURLConnection sendSynchronousRequest:returningResponse:error:] を呼んでいる。 NSURLConnection を非同期に使いたいなんて要望はもうそれこそかなり昔からあって、数多の車輪の再発明とブログと FAQ が生まれたわけですが、一昨年の Grand Central Dispatch1、GCD の登場でついに抜本的な解決が見えるかのように見えてわひょーいってなった割には
Summary 新リテラル - NSNumberリテラル,Boxed Expression, NSArrayリテラル,NSDictionaryリテラル, 添字アクセス コンパイラがメモリ管理を肩代わり - ARC (Automatic Retain Count) Cでも無名関数 - Blocks マルチスレッドプログラミングを簡単に - GCD (Grand Central Dispatch) Bundlerライクなライブラリ管理 - CocoaPods はじめに Objective-C のプログラミング環境はどんどん良くなってる コーディングを楽に エンバグの軽減 一方、Web上の記事や書籍のコードは古いまま 古い情報に流されないためにも、新しいコンパイラやツールの機能を確認しておこう NSNumberリテラル void main(int argc, const char *argv[]
前回紹介したdispatch_applyはブロックの処理が終わるまで待ってくれていましたが、dispatch_asyncは別スレッドで処理されてしまうので、どの順番で処理されるのかも分からない状態でブロックを処理させっぱなしになってしまいます。 グループというのを使えば、asyncで処理する複数のブロックをひとつのグループにまとめて、それらのブロック全部が終わったタイミングを受け取る事が出来ます。 まず、グループを作る関数がこれです。 dispatch_group_t dispatch_group_create(void); 次に、グループで処理させたいブロックを渡すのがdispatch_group_asyncです。グループはasyncオンリーでsyncはありません。 void dispatch_group_async(dispatch_group_t group, dispatch_qu
前回のコードのように同じ処理をforループでキューに渡すようなとき、それ専用の関数がディスパッチには既に用意されています。dispatch_applyです。 void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t)); iterationsの数だけブロックをキューに渡して処理させます。ブロックはsize_tの引数を一つだけ持ち、よくあるforループと同じように0から1ずつ増やした値が渡されます。 まずは、サンプルコードです。 #include <stdio.h> #include <dispatch/dispatch.h> int main (int argc, const char * argv[]) { dispatch_queue_t queue = dispatch_ge
Queueを作る ディスパッチの基本的な使い方は、処理したいコードをブロックや関数で用意しておいて、キューにそのブロックや関数を渡すという流れになります。 ディスパッチのキューには2種類あります。アプリ(OS?)に最初から一つ用意されているグローバルキューと、自分で作るキューです。グローバルキューは並列に処理できますが、自分で作るキュー(以後シリアルキューと書いて区別します)は入れていった順番に直列でしか処理できません。 キューはdispatch_queue_tという型のオブジェクトで表されます。ディスパッチのオブジェクトは他にもいくつかありますが、それは次回以降に後回しにします。 グローバルキューを取得するにはこの関数を使います。 dispatch_queue_t dispatch_get_global_queue(long priority, unsigned long flags);
Grand Central Dispatchについて日本語で丁寧に詳しく説明してくれるサイトはないかなぁと待っていたのですが、待っている間にひととおり自分なりに調べ終えてしまったので、まとめて書いておきます。まちがいに気がついたらご指摘いただけるとうれしいです。 Grand Central Dispatch(以下ディスパッチと書きます。リファレンスとか関数名とかGrand Centralって全然ついていなくてDispatchだけですし。)とはなんぞやというと、Snow Leopardから導入された並列処理のAPIです。並列処理といえばLeopardではNSOperationというObjective-CのAPIが導入されましたが、ディスパッチはC言語のAPIとして用意されていて、システムに近い低レベルなところで使えるものです。 あれこれ試した印象で言うと、コアが2つしかないCPUのMacでた
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く