2012-03-06

さよならGoogle

ありがとう。
今後ブログの更新はしないですが、過去の記録のため残しておきます。

どこで歯車が狂ったんでしょうか。
なんかGoogleと関りたくないのです。
もはや。

でも確かに輝いていました、かつては。
それでいいじゃないですか。

2012-01-21

グランドセントラルディスパッチィィィ

カッコいいですね、Appleの新必殺技グランドセントラルディスパッチ
通称GCD。

勉強不足なもので、非同期処理するにはNSThreadとかNSOperationQueueとか使うもんだと思ってましたが、この新しいテクノロジであるGCDを使えば、もっとずっとシンプルに複雑なものごとを解決できます。
使わないと損です。
なので時期的には今さらですし、他のサイト見たほうがいいんですが書いときます。

たとえば重い処理をUIの裏で実行して結果が出てきたらUIに反映する。これ言うほど簡単じゃないですが、GCDなら簡単に書けます。

- (IBAction)onClick:(id)sender {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // UIと関係なく実行できる重い処理を別スレッドでやる
        NSData *data = [[HardWork new] doYourJobWithVeryHard:YES];

        // 結果が出たらメインスレッドで以下の実行を依頼(UIはメインスレッドでのみ動く)
        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateMyData:data];
        });
    });
}

非同期処理がまるで同期的に書けてしまいます。dispatch_asyncと^{ }で囲むだけ!
やるべき処理の内容が複数箇所に分散しないで書けるのがいいですね。
また、performSelector:系だと渡せる引数は1個という制限が地味に面倒でしたが、ブロックで渡すのでコンテキストで見えてる値はなんでも参照できるのもありがたい。

気になったのは、dispatch_asyncの第2引数のブロックはBlock_copyされるとドキュメントにはあるのですが、そこでメモリが足りなかった場合何が起きるのでしょうか、という点。
dispatch_asyncの戻り値はvoidなのでエラーが返ることはないし...。でもBlock_copyは失敗する可能性あるだろっ、ていう。

アプリケーションデリゲートをレスポンダチェインに含められるようになった

これまではアプリケーションデリゲートはこんなふうに書いてたけど、
@interface AppDelegate : NSObject <UIApplicationDelegate>
こう書くことで、
@interface AppDelegate : UIResponder <UIApplicationDelegate>

レスポンダチェインにAppDelegateのインスタンスも参加できるようになった。

いつ仕様変更になったのかのドキュメントは見つけられなかったけど、Storyboardのドキュメントに書いてあったからたぶんiOS5以降だろう。シミュレーターでiOS4で試した場合はダメだったから。

これでnilをターゲットとしたアクションの最後のターゲットとしてAppDelegateを使えるようになる!