Cocoa勉強会関西  @yashigani
[@yashigani description]FenrirでMac/iOSアプリを作ってますVim/zsh/gitObjective-C, Haskell, RubyMac/iOS/Android[yashigani days] yashig...
できる!マルチスレッドプログラミング
きょうの目的Cocoaのマルチスレッドプログラミングをおさらいする あんまり難しいことは話しません 非同期処理入れたいときに,「あ!なんと なく聞いたことある」くらいになってくだ さい
マルチスレッドプログラミングとは複数のスレッドを使ってを処理を同時に実行することiOSは同時に動かせるアプリがひとつ メインスレッドをブロックすると端末が フリーズしたように見えるOS Xだとレインボーサークルがまわる
マルチスレッドプログラミングができると  マルチスレッドプログラミングができる  かっこいいグルグルとかギューンってなる  プログレスバーを実装できる  いい感じのUIのアプリができる!
モテる!
マルチスレッドプログラミングができると  マルチスレッドプログラミングができる  重い処理を並列で処理できる  さくさく動くアプリができる!
モテる!
マルチスレッドプログラミングができないと  マルチスレッドプログラミングができない  プチプチ止まるアプリができる  重い ★☆☆☆☆  クソ ★☆☆☆☆  落ちる ★☆☆☆☆
非モテ
非モテとかいうレベルじゃねーぞ!一定時間以上止まるアプリはシステムに殺される(iOS)ちょっとでもレインボーサークルがまわると大きく印象がDown(Mac)もはやマルチスレッドプログラミングは アプリケーションエンジニアの嗜み
難しそう  あれでしょ?スレッドでしょ?  スレッドとかよくわからんしースレッドの管理やタスクのスケジューリングは長らく難しいプログラミング技法とされてきた
Dont worryCocoaならそんなことありませんしかもiOSもOS Xも同じ
How to?NSTreadperformSelectorInBackground:Grand Central Dispatch(GCD)Operation queues(NSOperationQueue,NSOperation)
GCDかOperation queuesを使おう NSThread は使うの自体が難しい performSelectorは使えなくはないけど... GCD/Operation queuesなら細かいこと を気にしなくてもいい お互いが似ている/...
About GCDOS X 10.6, iOS 4.0から入ったBlocksとdispatch queueCのAPIでバックグラウンド処理を抽象化スレッドの管理やタスクのスケジューリングはしなくてもいい
About Operation queuesOS X 10.5, iOS2.0からNSOperationとNSOperationQueueObjective-CのAPIでバックグラウンド処理を抽象化スレッドの管理やタスクのスケジューリングはしな...
どうやるの?(GCD)dispatch queue作ってタスクをBlocksでくるんでBlocksをdispatch queueにadd
どうやるの?(Operation queues) NSOperationQueue作って タスクをNSOperationでくるんで NSOperationをNSOperationQueueにadd
すごく似ているGCDとOperation queuesを使ったプログラミングモデルは非常に良く似ている片方覚えればだいたい両方使える場面によって簡単に使い分け/書き換え 適材適所で使い分けられることが大事 書き換えるときほとんど構造を壊さない
Good for GCDBlocksを使って書けるので,書き換えが楽 普通に書いたあと,「やっぱりここは並列 で」みたいなのがすぐできる なにも考えずにdispatchするだけなら簡単遅延実行したりタスク間の同期をとったり,細かいレベルで制御す...
Bad for GCDさくっとキャンセルできないBlocksを多用するので少し読みにくいBlocksを使う特有の問題(循環参照とか) 循環参照の問題はだいたい実行が遅延する コードで起こる
Good for Operation queuesObjective-Cのみで書ける実はGCDベースで動いてるわりとかんたんに並列数を決めたりできるタスクをNSOperationで表現するのでスッキリするキャンセルかんたんKVO使える
Bad for Operation queuesNSOperationQueueを管理する必要があるサブクラス化が必要 処理を追いにくくなるタスク間の同期をとったりするのが難しい かゆいところに手が届かない
非同期処理の使いどころメインスレッドのブロックを減らしたいとき CoreData ファイルI/O レイアウト計算重い処理を(複数)走らせないといけないとき メインスレッドをブロックしたくない ファイルI/Oなどを短期間に複数走らせる
まずチェックしておきべきことメインスレッドをブロックしすぎないかブロックしすぎそうなら並列化を検討本当に並列処理できるか実は非スレッドセーフだったというのはありがちな失敗パターン並列に処理してみたら変な状態になったってのもありがちなパターン
並列処理?ざっくりいうと同時に処理できるかどうかリファレンスにスレッドセーフかどうか書いてある複数の処理を逐次実行してほしい場合はGCDの場合はserial queueを作るNSOperationQueueの場合はmaxConcurrentOp...
どっちを使うべきかやりっぱなしかどうか メインスレッドで呼びたいだけはGCDを 使うのが鉄板キャンセルが必要か状態監視が必要か(プログレスバー出すとか)
まとめマルチスレッドプログラミングができると確実にモテるCocoaならマルチスレッドプログラミングは怖くないGCDとOperation queuesを臨機応変に使おう設計段階から並行処理を見越した設計にすると簡単にいじれて便利
Upcoming SlideShare
Loading in …5
×

Cocoa関西勉強会#49

2,715 views

Published on

マルチスレッドプログラミングについてやんわりと

Published in: Technology

Cocoa関西勉強会#49

  1. 1. Cocoa勉強会関西 @yashigani
  2. 2. [@yashigani description]FenrirでMac/iOSアプリを作ってますVim/zsh/gitObjective-C, Haskell, RubyMac/iOS/Android[yashigani days] yashigani.hatenablog.comCocoa歴は4年目くらい
  3. 3. できる!マルチスレッドプログラミング
  4. 4. きょうの目的Cocoaのマルチスレッドプログラミングをおさらいする あんまり難しいことは話しません 非同期処理入れたいときに,「あ!なんと なく聞いたことある」くらいになってくだ さい
  5. 5. マルチスレッドプログラミングとは複数のスレッドを使ってを処理を同時に実行することiOSは同時に動かせるアプリがひとつ メインスレッドをブロックすると端末が フリーズしたように見えるOS Xだとレインボーサークルがまわる
  6. 6. マルチスレッドプログラミングができると マルチスレッドプログラミングができる かっこいいグルグルとかギューンってなる プログレスバーを実装できる いい感じのUIのアプリができる!
  7. 7. モテる!
  8. 8. マルチスレッドプログラミングができると マルチスレッドプログラミングができる 重い処理を並列で処理できる さくさく動くアプリができる!
  9. 9. モテる!
  10. 10. マルチスレッドプログラミングができないと マルチスレッドプログラミングができない プチプチ止まるアプリができる 重い ★☆☆☆☆ クソ ★☆☆☆☆ 落ちる ★☆☆☆☆
  11. 11. 非モテ
  12. 12. 非モテとかいうレベルじゃねーぞ!一定時間以上止まるアプリはシステムに殺される(iOS)ちょっとでもレインボーサークルがまわると大きく印象がDown(Mac)もはやマルチスレッドプログラミングは アプリケーションエンジニアの嗜み
  13. 13. 難しそう あれでしょ?スレッドでしょ? スレッドとかよくわからんしースレッドの管理やタスクのスケジューリングは長らく難しいプログラミング技法とされてきた
  14. 14. Dont worryCocoaならそんなことありませんしかもiOSもOS Xも同じ
  15. 15. How to?NSTreadperformSelectorInBackground:Grand Central Dispatch(GCD)Operation queues(NSOperationQueue,NSOperation)
  16. 16. GCDかOperation queuesを使おう NSThread は使うの自体が難しい performSelectorは使えなくはないけど... GCD/Operation queuesなら細かいこと を気にしなくてもいい お互いが似ている/足りないところを補い合う 関係
  17. 17. About GCDOS X 10.6, iOS 4.0から入ったBlocksとdispatch queueCのAPIでバックグラウンド処理を抽象化スレッドの管理やタスクのスケジューリングはしなくてもいい
  18. 18. About Operation queuesOS X 10.5, iOS2.0からNSOperationとNSOperationQueueObjective-CのAPIでバックグラウンド処理を抽象化スレッドの管理やタスクのスケジューリングはしなくてもいい
  19. 19. どうやるの?(GCD)dispatch queue作ってタスクをBlocksでくるんでBlocksをdispatch queueにadd
  20. 20. どうやるの?(Operation queues) NSOperationQueue作って タスクをNSOperationでくるんで NSOperationをNSOperationQueueにadd
  21. 21. すごく似ているGCDとOperation queuesを使ったプログラミングモデルは非常に良く似ている片方覚えればだいたい両方使える場面によって簡単に使い分け/書き換え 適材適所で使い分けられることが大事 書き換えるときほとんど構造を壊さない
  22. 22. Good for GCDBlocksを使って書けるので,書き換えが楽 普通に書いたあと,「やっぱりここは並列 で」みたいなのがすぐできる なにも考えずにdispatchするだけなら簡単遅延実行したりタスク間の同期をとったり,細かいレベルで制御するためのAPIがある ※ ただし難しい
  23. 23. Bad for GCDさくっとキャンセルできないBlocksを多用するので少し読みにくいBlocksを使う特有の問題(循環参照とか) 循環参照の問題はだいたい実行が遅延する コードで起こる
  24. 24. Good for Operation queuesObjective-Cのみで書ける実はGCDベースで動いてるわりとかんたんに並列数を決めたりできるタスクをNSOperationで表現するのでスッキリするキャンセルかんたんKVO使える
  25. 25. Bad for Operation queuesNSOperationQueueを管理する必要があるサブクラス化が必要 処理を追いにくくなるタスク間の同期をとったりするのが難しい かゆいところに手が届かない
  26. 26. 非同期処理の使いどころメインスレッドのブロックを減らしたいとき CoreData ファイルI/O レイアウト計算重い処理を(複数)走らせないといけないとき メインスレッドをブロックしたくない ファイルI/Oなどを短期間に複数走らせる
  27. 27. まずチェックしておきべきことメインスレッドをブロックしすぎないかブロックしすぎそうなら並列化を検討本当に並列処理できるか実は非スレッドセーフだったというのはありがちな失敗パターン並列に処理してみたら変な状態になったってのもありがちなパターン
  28. 28. 並列処理?ざっくりいうと同時に処理できるかどうかリファレンスにスレッドセーフかどうか書いてある複数の処理を逐次実行してほしい場合はGCDの場合はserial queueを作るNSOperationQueueの場合はmaxConcurrentOperationCount = 1NSBlockOperationを使うのも手
  29. 29. どっちを使うべきかやりっぱなしかどうか メインスレッドで呼びたいだけはGCDを 使うのが鉄板キャンセルが必要か状態監視が必要か(プログレスバー出すとか)
  30. 30. まとめマルチスレッドプログラミングができると確実にモテるCocoaならマルチスレッドプログラミングは怖くないGCDとOperation queuesを臨機応変に使おう設計段階から並行処理を見越した設計にすると簡単にいじれて便利

×