メソッドをメインスレッドで実行する
この項で記した、メインスレッドで実行しないとビューが更新されない問題は、もっと良い方法で解決できそうだ。
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];