• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Cocoa関西勉強会#49
 

Cocoa関西勉強会#49

on

  • 1,896 views

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

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

Statistics

Views

Total Views
1,896
Views on SlideShare
1,548
Embed Views
348

Actions

Likes
4
Downloads
2
Comments
0

3 Embeds 348

http://yashigani.hatenablog.com 336
https://twitter.com 9
http://webcache.googleusercontent.com 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Cocoa関西勉強会#49 Cocoa関西勉強会#49 Presentation Transcript

    • Cocoa勉強会関西 @yashigani
    • [@yashigani description]FenrirでMac/iOSアプリを作ってますVim/zsh/gitObjective-C, Haskell, RubyMac/iOS/Android[yashigani days] yashigani.hatenablog.comCocoa歴は4年目くらい
    • できる!マルチスレッドプログラミング
    • きょうの目的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するだけなら簡単遅延実行したりタスク間の同期をとったり,細かいレベルで制御するためのAPIがある ※ ただし難しい
    • 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の場合はmaxConcurrentOperationCount = 1NSBlockOperationを使うのも手
    • どっちを使うべきかやりっぱなしかどうか メインスレッドで呼びたいだけはGCDを 使うのが鉄板キャンセルが必要か状態監視が必要か(プログレスバー出すとか)
    • まとめマルチスレッドプログラミングができると確実にモテるCocoaならマルチスレッドプログラミングは怖くないGCDとOperation queuesを臨機応変に使おう設計段階から並行処理を見越した設計にすると簡単にいじれて便利