メソッドをメインスレッドで実行する

この項で記した、メインスレッドで実行しないとビューが更新されない問題は、もっと良い方法で解決できそうだ。

NSObject (NSMainThreadPerformAdditions) で定義されている次のメソッドを使う。

[self performSelectorOnMainThread: @selector(someMethodSelector)  withObject: nil  waitUntilDone: NO];

引数は一つまで withObject で指定できる。

[self performSelectorOnMainThread: @selector(anotherMethodSelector)  withObject: [NSNumber numberWithInt: 123]  waitUntilDone: NO];

前回の記事のプログラムは sharedSession を使って次のように書ける。

// 取得するコンテンツの URL
NSURL *url = [NSURL URLWithString: @"http://example.com/path/to/content"];

// セッションを作成する
NSURLSession *session = [NSURLSession sharedSession];

// データの取得を開始する
[[session
	dataTaskWithURL: url
	completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error)
{
	// 取得したデータを文字列に変換する
	NSString *response = [[NSString alloc] initWithData: data  encoding: NSUTF8StringEncoding];

	NSLog(@"Got response %@ with error %@.\n", response, error);
	NSLog(@"DATA:\n%@\nEND DATA\n", response);

	// sharedSession なのでセッションの後始末は不要
	// これを行うと 2 回目以降の呼び出しでエラーとなる
	//[session invalidateAndCancel];

	// メインスレッドでビューを更新する
	[self performSelectorOnMainThread: @selector(someMethodSelector)  withObject: nil  waitUntilDone: NO];

}] resume];