20120616i phonedeveloperworkshop
DESCRIPTION
2012/06/16の勉強会資料ですTRANSCRIPT
「エキスパートObjective-C
プログラミング」で始めるGCD入門朔 洋一郎(@saku2saku)
当勉強会についてiPhoneアプリ開発者の交流技術情報の交換比較的初心者の方も多いですというか自分もそこまで熟練者ではないです
そのため、もしかしたら間違ったことを言ってしまうかもしれませんがご容赦ください
一緒にアプリ開発の勉強をしていきましょう!
自己紹介名前朔 洋一郎
趣味漫画を読みあさるプログラミング料理趣味創り
製作iPhoneアプリ
世界夜景旅行 for iPhoneMusicPlayerSleepTimerMusicPlayerSleepTimerFree
iPadアプリ世界夜景旅行工場夜景探検夜桜花見旅行
Webさくさく日記
http://iphonework.biz/iPhone Developer Workshop
http://workshop.iphonework.biz/
「エキスパートObjective-C
プログラミング」で始めるGCD入門
GCDとは?Grand Central Dispatch の略マルチスレッドプログラミングをシステムレベルで実装した枠組み開発者はタスクを定義して、それをキューに追加するだけでマルチスレッド処理を実現できる簡単に実装する上で細かいスレッドの制御を気にする必要なくコードを記述できる細かい制御(セマフォやjoinなど)をすることも可能
iOS4 以降から利用が可能になりました
キュー、タスクとは?タスクとは処理の定義、キューとはタスクを格納する処理の実行列タスクはBlocksで定義されるキューはFirst In First Outの概念の実行列
dispatch_async(queue, ^{...});
キューの種類キューは2種類ありますシリアル実行キュー:Aのタスクが終了した後にBのタスクが実行される並列実行キュー:AとBのタスク両方が並列に実行される
OS4 以前のマルチスレッドプログラミングはどうしていたか?NSObjectのperformSelectorInBackgroundやNSOperation、NSThreadなどで実装
キューの種類タスク
キュー スレッド
1
2
3
4
シリアル実行キュー
並列実行キュー
実行順
実行順
キューの種類サンプルコードhttp://workshop.iphonework.biz/files/2012/06/SampleCode.zip並列実行キューPerformInBackgroundConcurrentGCDConcurrent
シリアル実行キューPerformOnMainThreadSerialGCDSerial
Blocksの利用GCDのタスク定義はBlocksを利用するBlocksについては前回サンプルを含め、基本的な使い方の説明も前回しているので良ければ参照してください
http://workshop.iphonework.biz/?p=446
Global Dispatch Queueキューは自前で生成するキューと、デフォルトで存在するキューの2種類があるHigh Priority: 優先度 高Default Priority: 優先度 標準Low Priority: 優先度 低Background Priority: 優先度 バックグラウンド
上記は全てConcurrentの実行キューMain Dispatch Queueというデフォルトで存在するキューもある(メインスレッド)
dispatch_queue_tのライフサイクル
キューにはretainとreleaseの概念があるARCが有効な場合にも上記は必要なので注意
dispatch_queue_createでキューの生成dispatch_queue_releaseでキューの廃棄
Global Dispatch Queueについてはreleaseは不要
その他サンプルテーブルビューの画像の非同期読み込み処理AsyncImageLoadTable
一歩進んだ使い方dispatch_after数秒おいて処理を実行したいときに利用正確なシステム時間による処理ではないため、ある程度おおざっぱな処理向き
dispatch_group_asyncとdispatch_group_notify複数のdispatch_queueの処理の実行が全て終了した後に処理を実行したいときに使用
さらに進んだ使い方「エキスパートObjective-C プログラミング」で詳しく説明されていますのでご参照ください!Amazon社のサイト
追記:質疑応答についてdispatch_get_global_queueの第二引数のunsigned long って何が妥当なんですか?第二引数は予約領域となり、常に0を渡すことが公式に推奨されております
AsyncImageLoadTableのサンプルでdispatch_queue_createしていますがこれは沢山のキューが作られてしまうのでは?これは dispatch_get_global_queue と間違えていたため、修正しました
ご清聴ありがとうございました