20120721_ishkawa

1,504 views
1,446 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

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

No notes for slide

20120721_ishkawa

  1. 1. 並列処理再入門 主にNSOperationの話 @_ishkawa
  2. 2. @_ishkawa • 新卒プログラマー @面白法人カヤック • Objective-C:1年ちょっと • Twitterクライアントつくった GitHub: ishkawa Blog: http://blog.ishkawa.org
  3. 3. 今日の話• Grand Central Dispatch• NSOperation• 両者をどう使うか
  4. 4. 並列処理の大切さ
  5. 5. iOSの並列処理ちょっと大変 • NSThread • Grand Central Dispatch推奨されている • NSOperation - concurrent - non-concurrent 参考: 並列プログラミングガイド(Apple)
  6. 6. Grand Central Dispatch• 速い / 簡単 / かっこいい• 並列処理のあれこれが楽にできる (排他制御, 逐次実行 など)• 処理の拡張には向かない (関数+Blocksなので)
  7. 7. Grand Central Dispatchdispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(queue, ^{ // async dispatch_async(dispatch_get_main_queue(), ^{ // callback });});
  8. 8. NSOperation• 拡張性が高い (オブジェクトなので)• 複雑な処理をラッピングしやすい• 内部的にGCDが使われている(iOS4)
  9. 9. NSOperation 同期 •NSOperationのmainをオーバーライド (NSOperationQueueに入れれば非同期実行されます) 非同期•NSOperationのstart, cancelなどをオーバーライド•いろいろとKVO準拠する
  10. 10. 両者の扱い• GCD • NSOperation 関数 + Blocks オブジェクト- 準備要らず簡単に扱える - 準備要るが拡張しやすい- 例:画像の圧縮など - 例:前後処理を含めた通信
  11. 11. ここからNSOperationの 拡張の話になります
  12. 12. 例: Twitter API• 目的:API → NSDictionary• タスク 1. HTTPリクエストを組み立てる(OAuth1.0a) 2. ネットワーク通信 3. JSONパース• 問題 1. 毎回書くのはつらい 2. 並列処理しないとUXに影響がある
  13. 13. ラッピングしたい 並列処理 メインネットワーク通信 JSONパース 終了ハンドラ
  14. 14. ラッピングしたい[ISTwitterOperation sendRequestWithMethod:ISHTTPMethodGET path:@”statuses/home_timeline.json” params:nil handler:^(NSURLRequest *r, id object, NSError *error){ if (error) return; self.array = object; }];
  15. 15. NSOperationの拡張• ISNetworkOperation (NSURLConnectionを管理してNSDataを返す)• ISJSONNetworkOperation ( + JSONパースしてNSDictionary, NSArrayを返す)• ISTwitterOperation ( APIPath, HTTPMethodからHTTPリクエストを準備(OAuth認証つき))
  16. 16. 拡張コード@implementation ISJSONNetworkOperation- (id)processData:(NSData *)data{ NSError *error = nil; id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; if (error)return nil; return object;}
  17. 17. いろいろ拡張できる - ISNetworkOperation - ISImageNetworkOperation - ISXMLNetworkOperation - ISHTMLTitleOperation - ISJSONNetworkOperation - ISTwitterOperation - ISFacebookOperation - ISPocketOperation - ISInstapeperOperation
  18. 18. 結論:拡張性がある並列処理を書くなら NSOperationが良さそうです

×