UI 関連の機能はメインスレッドで実行すること : Objective-C プログラミング

PROGRAM


UI 関連の機能はメインスレッドで実行すること

iOS アプリでは、UI 関連の機能は必ずメインスレッドからアクセスする必要があります。

例えば、ラベルのテキストを設定するメソッドを呼び出す場合、通常であれば次のようにします。

label.text = @"TITLE";

ところが、これをメインスレッド以外のスレッドで実行したい場合には、次のような感じで、メインスレッドでの実行に切り替える必要がでてきます。

[label performSelectorOnMainThread:@selector(setText:) withObject:@"TITLE" waitUntilDone:YES];

このようにメインスレッドで setText: を実行しないと、ちゃんと動いたり、無視されて何も表示されなかったり、表示する文字列が逆さまに表示されたりと、不安定な動作になります。

 

ちなみに waitUntilDone は、YES にするとメソッドがメインスレッドで実行され終わるのを待つことができます。

別々のスレッドで処理する場合、上記の例では performSelectorOnMainThread で呼び出した処理がいつ実行されるか判らないため、それが確実に実行されてから、それ以降の処理を続けたいときに waitUntilDone を YES にします。

別スレッドから結果を得たい場合にも、メソッドの引数で値を受け取れるようにしておいて、メソッドを waitUntilDone を YES で呼び出せば、渡した変数に結果がセットされ終わってから、次の処理でそれを使うこともできたりします。

[ もどる ]