20120616i phonedeveloperworkshop

18
「エキスパート Objective-C プログラミング」で始める GCD 入門 朔 洋一郎 (@saku2saku)

Upload: yoichiro-sakurai

Post on 18-Jun-2015

2.884 views

Category:

Documents


1 download

DESCRIPTION

2012/06/16の勉強会資料です

TRANSCRIPT

Page 1: 20120616i phonedeveloperworkshop

「エキスパートObjective-C

プログラミング」で始めるGCD入門朔 洋一郎(@saku2saku)

Page 2: 20120616i phonedeveloperworkshop

当勉強会についてiPhoneアプリ開発者の交流技術情報の交換比較的初心者の方も多いですというか自分もそこまで熟練者ではないです

そのため、もしかしたら間違ったことを言ってしまうかもしれませんがご容赦ください

一緒にアプリ開発の勉強をしていきましょう!

Page 3: 20120616i phonedeveloperworkshop

自己紹介名前朔 洋一郎

趣味漫画を読みあさるプログラミング料理趣味創り

Page 4: 20120616i phonedeveloperworkshop

製作iPhoneアプリ

世界夜景旅行 for iPhoneMusicPlayerSleepTimerMusicPlayerSleepTimerFree

iPadアプリ世界夜景旅行工場夜景探検夜桜花見旅行

Webさくさく日記

http://iphonework.biz/iPhone Developer Workshop

http://workshop.iphonework.biz/

Page 5: 20120616i phonedeveloperworkshop

「エキスパートObjective-C

プログラミング」で始めるGCD入門

Page 6: 20120616i phonedeveloperworkshop

GCDとは?Grand Central Dispatch の略マルチスレッドプログラミングをシステムレベルで実装した枠組み開発者はタスクを定義して、それをキューに追加するだけでマルチスレッド処理を実現できる簡単に実装する上で細かいスレッドの制御を気にする必要なくコードを記述できる細かい制御(セマフォやjoinなど)をすることも可能

iOS4 以降から利用が可能になりました

Page 7: 20120616i phonedeveloperworkshop

キュー、タスクとは?タスクとは処理の定義、キューとはタスクを格納する処理の実行列タスクはBlocksで定義されるキューはFirst In First Outの概念の実行列

dispatch_async(queue, ^{...});

Page 8: 20120616i phonedeveloperworkshop

キューの種類キューは2種類ありますシリアル実行キュー:Aのタスクが終了した後にBのタスクが実行される並列実行キュー:AとBのタスク両方が並列に実行される

OS4 以前のマルチスレッドプログラミングはどうしていたか?NSObjectのperformSelectorInBackgroundやNSOperation、NSThreadなどで実装

Page 9: 20120616i phonedeveloperworkshop

キューの種類タスク

キュー スレッド

シリアル実行キュー

並列実行キュー

実行順

実行順

Page 10: 20120616i phonedeveloperworkshop

キューの種類サンプルコードhttp://workshop.iphonework.biz/files/2012/06/SampleCode.zip並列実行キューPerformInBackgroundConcurrentGCDConcurrent

シリアル実行キューPerformOnMainThreadSerialGCDSerial

Page 11: 20120616i phonedeveloperworkshop

Blocksの利用GCDのタスク定義はBlocksを利用するBlocksについては前回サンプルを含め、基本的な使い方の説明も前回しているので良ければ参照してください

http://workshop.iphonework.biz/?p=446

Page 12: 20120616i phonedeveloperworkshop

Global Dispatch Queueキューは自前で生成するキューと、デフォルトで存在するキューの2種類があるHigh Priority: 優先度 高Default Priority: 優先度 標準Low Priority: 優先度 低Background Priority: 優先度 バックグラウンド

上記は全てConcurrentの実行キューMain Dispatch Queueというデフォルトで存在するキューもある(メインスレッド)

Page 13: 20120616i phonedeveloperworkshop

dispatch_queue_tのライフサイクル

キューにはretainとreleaseの概念があるARCが有効な場合にも上記は必要なので注意

dispatch_queue_createでキューの生成dispatch_queue_releaseでキューの廃棄

Global Dispatch Queueについてはreleaseは不要

Page 14: 20120616i phonedeveloperworkshop

その他サンプルテーブルビューの画像の非同期読み込み処理AsyncImageLoadTable

Page 15: 20120616i phonedeveloperworkshop

一歩進んだ使い方dispatch_after数秒おいて処理を実行したいときに利用正確なシステム時間による処理ではないため、ある程度おおざっぱな処理向き

dispatch_group_asyncとdispatch_group_notify複数のdispatch_queueの処理の実行が全て終了した後に処理を実行したいときに使用

Page 16: 20120616i phonedeveloperworkshop

さらに進んだ使い方「エキスパートObjective-C プログラミング」で詳しく説明されていますのでご参照ください!Amazon社のサイト

Page 17: 20120616i phonedeveloperworkshop

追記:質疑応答についてdispatch_get_global_queueの第二引数のunsigned long って何が妥当なんですか?第二引数は予約領域となり、常に0を渡すことが公式に推奨されております

AsyncImageLoadTableのサンプルでdispatch_queue_createしていますがこれは沢山のキューが作られてしまうのでは?これは dispatch_get_global_queue と間違えていたため、修正しました

Page 18: 20120616i phonedeveloperworkshop

ご清聴ありがとうございました