GCD!
GCDをやっと使ってみたよ!
ブロックを受け取って、HTTPのリクエストが完了したときに起動するやつを書いてみた。
@implementation NSURLConnection (AsyncRequestWithContinuation) +(void) sendAsynchronousRequestWithContinuation:(NSURLRequest*)request continuation:(AsyncRequestContinuation)k { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ { NSURLResponse* response; NSError* error; NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; [response retain]; NSError* error2 = nil; //error ? [error copyWithZone:nil] : nil; [data retain]; dispatch_async(dispatch_get_main_queue(), ^ { k(response, data, error2); [response release]; [error2 release]; [data release]; }); }); } @end
感想:意外と良い
GCが無い言語でクロージャとか、頭おかしいんじゃないの、アホなの?って思ってたけど、Objective-Cという文脈で言うと意外と良いかもしれない。retainとreleaseの組が、一つのメソッドにまとめられたりするので、返って見通しが良くなる印象。
これが非同期の呼び出しだと、NSURLConnectionとかをインスタンス変数にしたりしなくちゃいけなくて、retainしてreleaseしてがバラバラになってしんどかった。