Objective-C で非同期処理

by ysawa

どうも 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 の操作は、いつでも「メインスレッド」で!!

こういうことを、きちーっとできるひとが
できるプログラマですね。

この記事を読んだあとに

ysawa

エヌ次元株式会社代表取締役
東京工業大学工学部計算工学専攻卒業
符号理論の応用に関する研究
在学中よりフリーランスエンジニアとして活動
「持続可能な設計」を得意領域とする
会社設立後も設計からアプリ制作や
Webサイトのコーディングまでを幅広く担当
セキュリティスペシャリスト

 このブログについて

このブログは、プログラマやエンジニアのためになる情報を垂れ流しています。
ちょっと異端的なものも含まれているかもしれません。