メインスレッド外で
NSURLConnection
Cocoa Study #61
Masayuki Nii
nii@msyk.net

13年9月6日金曜日
Agenda

NSURLConnection
NSOperation/NSOperationQueueによる並列処理
別スレッドで稼働させる方法
デモ

13年9月6日金曜日
NSURLConnection
とマルチスレッド処理

13年9月6日金曜日
NSURLConnectionとスレッド処理

ネットワーク処理のためのクラス

•
•

他に方法がないわけではないが、おそらく一番シンプル
非同期処理ができる

デリゲートされるメソッドを実装する

•
•
•

13年9月6日金曜日

実...
マルチタスクだ!
NSThreadとか、dispatchなんとかとか…

•
•

もちろん、Cocoaにはいろんなメソッドがある
ドキュメントを見よう!

Grand Central Dispatch (GCD) Reference

•
•...
NSOperationとNSOperationQueue

NSOperation

•
•
•

処理を抽象化したようなクラス
NSOperationQueueにNSOperationクラスのインスタンスを追加
すれば、「別スレッド」での実行...
Demo

13年9月6日金曜日
Demoのまとめ

確かにメインスレッドでデリゲートが処理される
そのままNSOperationQueueにしてもうまくいかない
setDelegateQueue:でうまく動いた

13年9月6日金曜日
setDelegateQueue:?

13年9月6日金曜日
だが、iOS 5では動かず

13年9月6日金曜日
Threadと組み合わせるには

13年9月6日金曜日
NSURLConnection+Threadでググった(1)

#3
13年9月6日金曜日
NSURLConnection+Threadでググった(2)

#1
#2

13年9月6日金曜日
通信処理とマルチスレッド
iOS 5/Lion以降はキューの上で動かせばOKか?

•

NSOperationQueueを確保した上で、setDelegateQueue:でキュ
ーを渡せば良さそう

デリゲート先はメインスレッドのみという誤解...
13年9月6日金曜日
まとめ

NSConnectionのデリゲートはメインスレッド以外でも
受け取れるし、iOS 5/OS X 10.7から非常に簡単にな
っている

13年9月6日金曜日
Upcoming SlideShare
Loading in …5
×

Cocoa勉強会#61-メインスレッド外でNSURLConnection

1,016 views
812 views

Published on

Cocoa勉強会#61
2013/9/7
メインスレッド外でNSURLConnection
新居雅行

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,016
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Cocoa勉強会#61-メインスレッド外でNSURLConnection

  1. 1. メインスレッド外で NSURLConnection Cocoa Study #61 Masayuki Nii nii@msyk.net 13年9月6日金曜日
  2. 2. Agenda NSURLConnection NSOperation/NSOperationQueueによる並列処理 別スレッドで稼働させる方法 デモ 13年9月6日金曜日
  3. 3. NSURLConnection とマルチスレッド処理 13年9月6日金曜日
  4. 4. NSURLConnectionとスレッド処理 ネットワーク処理のためのクラス • • 他に方法がないわけではないが、おそらく一番シンプル 非同期処理ができる デリゲートされるメソッドを実装する • • • 13年9月6日金曜日 実装方法は省略 普通に実装すると、それぞれのデリゲート処理がメインスレッドで 処理される 結果的に、重い処理をすると、ユーザインタフェースがスタック
  5. 5. マルチタスクだ! NSThreadとか、dispatchなんとかとか… • • もちろん、Cocoaにはいろんなメソッドがある ドキュメントを見よう! Grand Central Dispatch (GCD) Reference • • 13年9月6日金曜日 The BSD subsystem, CoreFoundation, and Cocoa APIs have all been extended to use these enhancements to help both the system and your application to run faster, more efficiently, and with improved responsiveness. GCD is not restricted to system-level applications, but before you use it for higher-level applications, you should consider whether similar functionality provided in Cocoa (via NSOperation and block objects) would be easier to use or more appropriate for your needs.
  6. 6. NSOperationとNSOperationQueue NSOperation • • • 処理を抽象化したようなクラス NSOperationQueueにNSOperationクラスのインスタンスを追加 すれば、「別スレッド」での実行をしてくれる NSOperationQueueを単に生成して、addOperation:メソッドで NSOperationを追加すれば、それでほぼOK NSOperationの継承クラス • • 13年9月6日金曜日 ブロックなら、NSBlockOperationクラスがあり便利 独自のクラスを継承して作るのも可能で比較的簡単
  7. 7. Demo 13年9月6日金曜日
  8. 8. Demoのまとめ 確かにメインスレッドでデリゲートが処理される そのままNSOperationQueueにしてもうまくいかない setDelegateQueue:でうまく動いた 13年9月6日金曜日
  9. 9. setDelegateQueue:? 13年9月6日金曜日
  10. 10. だが、iOS 5では動かず 13年9月6日金曜日
  11. 11. Threadと組み合わせるには 13年9月6日金曜日
  12. 12. NSURLConnection+Threadでググった(1) #3 13年9月6日金曜日
  13. 13. NSURLConnection+Threadでググった(2) #1 #2 13年9月6日金曜日
  14. 14. 通信処理とマルチスレッド iOS 5/Lion以降はキューの上で動かせばOKか? • NSOperationQueueを確保した上で、setDelegateQueue:でキュ ーを渡せば良さそう デリゲート先はメインスレッドのみという誤解? • 以前はそうだったのかもしれないが、今は違う RunLoopをどうにかする? • • • • • 13年9月6日金曜日 iOS 4まではこの方法しかなかった あちらこちらでRunLoopを動かしても影響はないとは言え… スレッド内でrunMode:という自前ループは確かにあるが… クラスのドキュメントには、scheduleInRunLoop:forMode: Cocoa in the Shell でもう少しスマートな方法も(次のスライド)
  15. 15. 13年9月6日金曜日
  16. 16. まとめ NSConnectionのデリゲートはメインスレッド以外でも 受け取れるし、iOS 5/OS X 10.7から非常に簡単にな っている 13年9月6日金曜日

×