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してがバラバラになってしんどかった。