どうも Objective-C での非同期処理(遅延処理)の書き方をいつも忘れてしまう。
そもそも、非同期処理とは?
人間の脳みそも、コンピュータも一緒です。
必ず、思考や処理は、
メインスレッド、サブスレッドのような、
枠組みで考えることができます。
意識があるのが、メインスレッドでの処理。
無意識にやってしまっているのが、サブスレッドでの処理。
基本的に「メインスレッド」で処理ができたら嬉しいのですが、
そういうわけにもいかないわけです。
何かをインターネットからダウンロードさせたり、
数学的な難しい演算を処理するのには、
時間が掛かるわけです。
「メインスレッド」を使っていたら、
いつまで経っても表示が完了しないで、
もっさりとしたアプリになってしまいます。
そんなときに用いるのが「サブスレッド」による「非同期処理」です。
人間でも、「新聞を読みながら、
朝食をとるので、消化はお休みします」では困るわけです。
ちゃんと、消化器官は「サブスレッド」として、
働いていてくれます。
「メインスレッド」と「サブスレッド」の使い分け、
これは、人間においてもコンピュータにおいても
非常に重要な技術ということです。
非同期処理の書き方
僕のように忘れてしまう人のために、
あえて覚えなくても良いですが、
いつでも取り出せるように以下をコピペして、
Evernote にでも貼り付けておきましょう。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { // (サブスレッド) ここに遅延処理を書きます dispatch_async(dispatch_get_main_queue(), ^(void){ // (メインスレッド) ここで遅延処理の結果を UI に反映させます }); });
注意事項
Android でもそうですが、iOS では UI を変更するのは
いつも「メインスレッド」でやらないといけません。
非同期処理をするときに「サブスレッド」に処理を渡して、
「メインスレッド」に必ず結果を戻します。
その際に、「メインスレッド」で UI を操作してあげないといけません。
もし、「サブスレッド」で UI の操作をすると、
簡単にクラッシュして、アプリが閉じてしまうかと思います。
UI の操作は、いつでも「メインスレッド」で!!
こういうことを、きちーっとできるひとが
できるプログラマですね。
この記事を読んだあとに
- 書いた人のツイッター – Follow me!
- 『売上を3年連続20%成長させた18の秘訣』
- 運営しているアクションゲーム