Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
幸雄 村上
PDF, PPTX
1,352 views
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化 http://atnd.org/events/43950 http://www.zusaar.com/event/1077005
Technology
◦
Read more
4
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 55
2
/ 55
3
/ 55
4
/ 55
5
/ 55
6
/ 55
7
/ 55
8
/ 55
9
/ 55
10
/ 55
11
/ 55
12
/ 55
13
/ 55
14
/ 55
15
/ 55
16
/ 55
17
/ 55
18
/ 55
19
/ 55
20
/ 55
21
/ 55
22
/ 55
23
/ 55
24
/ 55
25
/ 55
26
/ 55
27
/ 55
28
/ 55
29
/ 55
30
/ 55
31
/ 55
32
/ 55
33
/ 55
34
/ 55
35
/ 55
36
/ 55
37
/ 55
38
/ 55
39
/ 55
40
/ 55
41
/ 55
42
/ 55
43
/ 55
44
/ 55
45
/ 55
46
/ 55
47
/ 55
48
/ 55
49
/ 55
50
/ 55
51
/ 55
52
/ 55
53
/ 55
54
/ 55
55
/ 55
More Related Content
PPTX
フロントエンドの技術を刷新した話し。
by
Yutaka Horikawa
PPTX
Unityネイティブプラグインマニアクス #denatechcon
by
DeNA
PDF
C#実装から見るDDD(ドメイン駆動設計)
by
Takuya Kawabe
PPT
ドメインロジックの実装方法とドメイン駆動設計
by
Tadayoshi Sato
PPTX
AndApp開発における全て #denatechcon
by
DeNA
PDF
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
by
Junichiro Kazama
PDF
WebStormでできること
by
kamiyam .
PDF
IDEALIZE YOU
by
佑介 九岡
フロントエンドの技術を刷新した話し。
by
Yutaka Horikawa
Unityネイティブプラグインマニアクス #denatechcon
by
DeNA
C#実装から見るDDD(ドメイン駆動設計)
by
Takuya Kawabe
ドメインロジックの実装方法とドメイン駆動設計
by
Tadayoshi Sato
AndApp開発における全て #denatechcon
by
DeNA
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
by
Junichiro Kazama
WebStormでできること
by
kamiyam .
IDEALIZE YOU
by
佑介 九岡
What's hot
PPTX
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
by
SEGADevTech
PPTX
プログラミング .NET Framework 第4版
by
信之 岩永
PDF
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
by
増田 亨
PDF
RUNNING Smalltalk - 実践Smalltalk
by
Sho Yoshida
ODP
Unity ネイティブプラグインの作成について
by
Tatsuhiko Yamamura
PDF
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
by
Takeshi Yoshida
PDF
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
by
賢次 海老原
PDF
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
PDF
基礎から学ぶ組み込みAndroid
by
demuyan
PPTX
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
by
Kenichi Hoshi
PDF
Java仮想マシンの実装技術
by
Kiyokuni Kawachiya
PDF
2015/11/15 Javaでwebアプリケーション入門
by
Asami Abe
PDF
Game BaaS Implemented in Ruby
by
dena_study
PDF
Unityネイティブプラグイン
by
MakotoItoh
PPTX
ゲームエンジニアのためのデータベース設計
by
sairoutine
PDF
PHPにおけるRIA事情と開発
by
konekto
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
by
SEGADevTech
プログラミング .NET Framework 第4版
by
信之 岩永
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
by
増田 亨
RUNNING Smalltalk - 実践Smalltalk
by
Sho Yoshida
Unity ネイティブプラグインの作成について
by
Tatsuhiko Yamamura
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
by
Takeshi Yoshida
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
by
賢次 海老原
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
基礎から学ぶ組み込みAndroid
by
demuyan
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
by
Kenichi Hoshi
Java仮想マシンの実装技術
by
Kiyokuni Kawachiya
2015/11/15 Javaでwebアプリケーション入門
by
Asami Abe
Game BaaS Implemented in Ruby
by
dena_study
Unityネイティブプラグイン
by
MakotoItoh
ゲームエンジニアのためのデータベース設計
by
sairoutine
PHPにおけるRIA事情と開発
by
konekto
Similar to RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
PDF
iPhone develop for Beginner
by
Sachiko Kajishima
PDF
DevLOVE iPhoneアプリ勉強会
by
Toshimitsu Takahashi
PDF
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
by
takuma mori
PPTX
2012 05-19第44回cocoa勉強会発表資料
by
OCHI Shuji
PDF
flasherがはじめてiOS開発をしてみて
by
佐藤 俊太郎
PPTX
iPhoneアプリ開発の歩き方〜Swift編〜
by
Yusuke SAITO
KEY
1.29.user,user,user
by
Tonny Xu
PDF
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
by
irgaly
PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
by
聡 中川
PPTX
最近のiOS開発の現状と実状
by
クラスメソッド株式会社
PDF
iPhoneとAndroidのアプリ開発最新潮流
by
Rakuten Group, Inc.
PDF
iOSアプリ開発講座
by
Inoue Hiroyuki
PPTX
第2回ビジネスモバイル研究会
by
Shuichi Yukimoto
PDF
Cocoa Pro5
by
hasegawa
PDF
もう怖くないモバイルアプリ開発!
by
Toshiki Iga
PDF
iOS豆知識ver0.0.5
by
ppengotsu Name
KEY
Objc lambda
by
matuura_core
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
by
Makoto Setoh
PDF
iOSやAndroidアプリ開発のGoodPractice
by
Ken Morishita
PDF
Apple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべて
by
Masaru Gushiken
iPhone develop for Beginner
by
Sachiko Kajishima
DevLOVE iPhoneアプリ勉強会
by
Toshimitsu Takahashi
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
by
takuma mori
2012 05-19第44回cocoa勉強会発表資料
by
OCHI Shuji
flasherがはじめてiOS開発をしてみて
by
佐藤 俊太郎
iPhoneアプリ開発の歩き方〜Swift編〜
by
Yusuke SAITO
1.29.user,user,user
by
Tonny Xu
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
by
irgaly
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
by
聡 中川
最近のiOS開発の現状と実状
by
クラスメソッド株式会社
iPhoneとAndroidのアプリ開発最新潮流
by
Rakuten Group, Inc.
iOSアプリ開発講座
by
Inoue Hiroyuki
第2回ビジネスモバイル研究会
by
Shuichi Yukimoto
Cocoa Pro5
by
hasegawa
もう怖くないモバイルアプリ開発!
by
Toshiki Iga
iOS豆知識ver0.0.5
by
ppengotsu Name
Objc lambda
by
matuura_core
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
by
Makoto Setoh
iOSやAndroidアプリ開発のGoodPractice
by
Ken Morishita
Apple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべて
by
Masaru Gushiken
More from 幸雄 村上
PDF
アプリケーション識別子.pdf
by
幸雄 村上
PDF
圧縮ネイティブ・ライブラリについて.pdf
by
幸雄 村上
PDF
分散環境におけるジャストインタイム設定の試み
by
幸雄 村上
PDF
SwiftのOptionalを理解する
by
幸雄 村上
PDF
え!それって参照渡し?
by
幸雄 村上
PDF
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
by
幸雄 村上
PDF
AppleScriptなど
by
幸雄 村上
PDF
MojaveのDark Mode
by
幸雄 村上
PDF
AppleScriptとは何ぞや
by
幸雄 村上
PDF
Web API 通信の符号化について
by
幸雄 村上
PPTX
Master-Detail App を実装する
by
幸雄 村上
PPTX
SwiftのOptionalを理解する
by
幸雄 村上
PPTX
Getting a packet trace
by
幸雄 村上
PPTX
The Bash in Tokyo : AppKitとUIKit
by
幸雄 村上
PPTX
RUDP
by
幸雄 村上
PPTX
Swiftでブロックチェーンを実装する
by
幸雄 村上
PPTX
ゲームの企画書づくりに挑戦
by
幸雄 村上
PPTX
IBM Watson Services for Core ML
by
幸雄 村上
PPTX
独自Documentクラス
by
幸雄 村上
PPTX
独自Documentクラス
by
幸雄 村上
アプリケーション識別子.pdf
by
幸雄 村上
圧縮ネイティブ・ライブラリについて.pdf
by
幸雄 村上
分散環境におけるジャストインタイム設定の試み
by
幸雄 村上
SwiftのOptionalを理解する
by
幸雄 村上
え!それって参照渡し?
by
幸雄 村上
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
by
幸雄 村上
AppleScriptなど
by
幸雄 村上
MojaveのDark Mode
by
幸雄 村上
AppleScriptとは何ぞや
by
幸雄 村上
Web API 通信の符号化について
by
幸雄 村上
Master-Detail App を実装する
by
幸雄 村上
SwiftのOptionalを理解する
by
幸雄 村上
Getting a packet trace
by
幸雄 村上
The Bash in Tokyo : AppKitとUIKit
by
幸雄 村上
RUDP
by
幸雄 村上
Swiftでブロックチェーンを実装する
by
幸雄 村上
ゲームの企画書づくりに挑戦
by
幸雄 村上
IBM Watson Services for Core ML
by
幸雄 村上
独自Documentクラス
by
幸雄 村上
独自Documentクラス
by
幸雄 村上
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
1.
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化 2013.10.22 Bitz
Co., Ltd. 村上幸雄 @m_yukio
2.
自己紹介 • 村上幸雄 @m_yukio • ビッツ有限会社 http://www.bitz.co.jp/ • 節電対策,
Bitz NowPlaying, RFC Viewer(申請中) • UNIX系ソフトハウスと組み込みシステムのベンチャーを経て2001年に 独立。 プラットフォームを限定せずに何にでも挑戦してきましたが、最近は iOSアプリ開発に注力しています。
3.
本日の内容 • iOSアプリケーションについて • iOSアプリケーション開発の流れ •
iOSアプリケーション開発のパターン化 • RFC Viewerの製作
4.
iOSアプリケーション 開発について
5.
• Mac OS
XのCocoaの機能縮小版。ただ し、独自のUIや改良個所があるので、 単なるサブセットでない。 • 使用禁止APIがあるが、C言語によるネ イティブ開発が行える。 • iOSはUNIX系のOSで、32bit/64bit対応。
6.
Objective-C • C言語にオブジェクト指向の拡張を施し たもの。 • Objective-C
2.0から、より使いやすくす る為の拡張が行われたが、基本は簡素 な言語。 • 歴史は非常に古い。
7.
@protocol プロトコル名メソッド宣言; :@end @interface クラス名
: スーパークラス名 プロトコル名 : @end @interface クラス名 : スーパークラス名 { 型名 インスタンス変数名; :} メソッド宣言; :@end@implementation クラス名メソッド定義{ 処理内容} : @end @interface クラス名 (カテゴリ名) メソッド宣言; : @end
8.
クラス定義 インターフェイス クラス名 #include 親クラス #import Cocoa/Cocoa.h インスタンス変数 @interface
Song : NSObject { id title;}- (id)title; メソッド - (void)setTitle: (id)aTitle;@end
9.
クラス定義 クラス実装 #include 実装するクラス名 #import “Song.h” @implementation
Song- (id)title インスタンス変数を返す { return title; } 以前の変数をオートリリースし - (void)setTitle:(id)aTitle { [title autorelease]; 渡された変数を所有している title = [aTitle retain]; }@end
10.
カテゴリ定義 拡張するクラス名 カテゴリ名 #import “NSString.h” @interface NSString
(Hello) - (NSString *)helloString;@end
11.
カテゴリ実装 拡張するクラス名 カテゴリ名 #import “Hello.h” @implementation NSString
(Hello) - (NSString *)helloString { return @”hello, world!”; }@end
12.
形式プロトコル @protocol Playable - (void)play; -
(void)stop;@end プロトコル名 プロトコルの採用 #import Cocoa/Cocoa.h #import “Playable.h” @interface Song : NSObject Playable { id title; プロトコル準拠の確認 } - (id)title; - (void)setTitle;@end if ([song conformsToProtocol:@protocol(Playable)]) { [song play]; } else { }
13.
クラスメソッド + (id)alloc; NSObject *obj
= [NSObject alloc]; クラス - (void)display; [obj display]; インスタンス インスタンスメソッド
14.
メモリ管理 /* 生成(retain) */ NSString
*title = [[NSString alloc] initWithString:@”hello”]; /* 解放 */ [title release]; /* autorelease */ for (;;) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *s1 = [[NSString alloc] initWithString:@”hello”]; [s1 autorelease]; NSString *s2 = @”hello”; NSString *s3 = [NSString stringWithString:@”hello”]; [pool release]; }
15.
#import #include “MyClass.h” #ifndef _H_MyClass #define
_H_MyClass @interface MyClass : NSObject : @end #endif #import “MyClass.h” = #import “MyClass.h” @interface MyClass : NSObject : @end
16.
Xcode 5 から
@import が利用できるよう になった。(Modules) 例) @import UIKit; @import UIKit.UIView;
17.
Objective-C 2.0以降のクラス実装のパターン @interface Document
: NSObject! @property (strong, nonatomic) NSString *version;! ! - (id)init;! - (void)dealloc;! @end! プロパティを利用 ! @interface Document ()! @property (strong, nonatomic) NSString *text;! - (void)_init;! @end! プライベート宣言はク ラス拡張で ! @implementation Document! ! @synthesize version = _version;! @synthesize text = _text;! ! - (id)init! {! self = [super init];! if (self) {! [self _init];! }! return self;! }! ! - (void)dealloc! {! self.version = nil;! self.text = nil;! }! ! - (void)_init! {! _version = @”1.0”;! _text = @”This is a pen.”;! }! ! @end! ARC有無に関わらず汎用的に 使える
18.
宣言済みプロパティ @property (nonatmic) NSString
*value; - (NSString *)value; - (void)setValue:(NSString *)newValue; 同等 @synthesize value = _value; @interface MyClass : NSObject @property (nonatmic) NSString *_value; @end @implementation MyClass - (NSString *)value { return _value; } - (void)setValue:(NSString *)newValue { [_value release]; _value = [newValue retain]; } @end 自動に宣言 ARCなしの場合は こんな感じ?
19.
プロパティ @interface Song :
NSObject { id _title; } - (id)title; - (void)setTitle:(id)title; @end @implementation Song - (id)title { return _title; } - (void)setTitle:(id)title { [title release]; _title = [title retain]; } @end @interface Song : NSObject @property (strong, nonatmic) NSString *title; @end @implementation Song @synthesize title = _title; @end プロパティを利用すれば、 ARCの利用有無に関わらず、 同じ記述が出来る。
20.
Cocoa touch • iOSアプリ開発にはC言語の知識も必要。 C++も知っておくと便利。 •
Objective-Cは簡素。Cocoa touchの知識 の有無が重要。
21.
Machのタスクとスレッド 実行状態 実行状態 実行状態 実行状態 実行状態 Machスレッド プロセスのデータと保護 プロセスのデータと保護 メモリ管理 メモリ管理 シグナル管理 シグナル管理 ディスクリプタ管理 ディスクリプタ管理 タイミングと統計情報 タイミングと統計情報 リソース制御 リソース制御 UNIXプロセス Machタスク
22.
Run Loop Events Run Loop Timers Application
23.
開発の流れ
24.
Apple Developerサイトにアクセス http://developer.apple.com/jp/ iOS Developer
Programに参加 Xcodeを入手し、インストールする シミュレータ/実機で開発 実機でAdHoc版の動作を確認 Storeに申請
25.
休憩
26.
WWDCノススメ Appleが年に一回世界中の開発者を集めて、新技術の紹介や開発にあたっての細かな 技術を説明する為のイベント。 • 方向性を肌で感じる。 • Apple技術者から直接情報を得られる。 • フィードバックも期待できる。 • 全体像をつかめる。とっかかりとなる。 • 参加者同士の交流。 • サードパーティとの交流。 • @twitterapi meetupなど
27.
パターン化
28.
パターン化について • 自分の型を持つ事は、コードの再利用 はもちろん、継続的な改善が期待でき る。 • 以下をバイブルとした。 『iOS開発におけるパターンによるオー トマティズム』木下誠
著
29.
Model-View-Controllerパターン Controller UI操作 更新 更新 通知 View Model 状態取得 従来型 Controller UI操作 更新 更新 通知 View Model Cocoa
30.
RFCViewerでのMVC AppDelegate View View View UI操作 更新 Controller ViewController ViewController ViewController 更新 通知 Document 更新 通知 Model(データ)を管理するコント ローラとしてDocumentを用意。 データ
31.
通信/並列処理のパターン ViewController Connector ResponseParser ResponseParser ResponseParser
32.
要求/応答のパターン • 1対n(お互い知らない) • 通知センター •
1対n(通知元を知っている) • キー値監視 • 1対1 • デリゲート • Blocks
33.
通知センター /* 通知元 */! NSString *ConnectorDidBeginRfc
= @ConnectorDidBeginRfc;! ! ! [[NSNotificationCenter defaultCenter] postNotificationName:ConnectorDidBeginRfc! object:self userInfo:userInfo];! ! ! /* 受信メソッドの登録 */! [[NSNotificationCenter defaultCenter] addObserver:self! selector:@selector(_connectorDidBeginRfc:) ! name:ConnectorDidBeginRfc! object:nil];! ! ! /**! * 受信メソッド! */! - (void)_connectorDidBeginRfc:(NSNotification*)notification! {! RFCResponseParser *parser;! parser = [[notification userInfo] objectForKey:@parser];! ! ...! }!
34.
キー値監視 /* Connectorの networkAccessingキーを監視
*/! [[Connector sharedConnector] addObserver:self! forKeyPath:@networkAccessing! options:0! context:NULL];! ! ! /* 値の変更を受信 */! - (void)observeValueForKeyPath:(NSString*)keyPath! ofObject:(id)object! change:(NSDictionary*)change! context:(void*)context! {! if ([keyPath isEqualToString:@networkAccessing]) {! [self _updateNetworkActivity];! }! }! ! ! /* 通知 */! [self willChangeValueForKey:@networkAccessing];! [self didChangeValueForKey:@networkAccessing];!
35.
デリゲート /* プロトコル */! @protocol
RFCResponseParserDelegate NSObject! - (void)parser:(RFCResponseParser*)parser didReceiveResponse: (NSURLResponse*)response;! @end! ! ! /* デリゲートのメソッドを呼び出す */! if ([self.delegate respondsToSelector:@selector(parser:didReceiveResponse:)]) {! [self.delegate parser:self didReceiveResponse:response];! }!
36.
Blocks /* Blocks定義 */! typedef
void (^RFCResponseParserCompletionHandler)(RFCResponseParser *parser);! ! ! /* 要求メソッドでBlocksを受け取る */! - (void)rfcIndexWithCompletionHandler:(RFCResponseParserCompletionHandler)completionHandler;! ! ! ! /* Blocksの呼び出し */! if (parser.completionHandler) {! parser.completionHandler(parser);! }! ! ! /* Blockの生成 */! __block MasterViewController * __weak blockWeakSelf = self;! [[Connector sharedConnector] rfcIndexWithCompletionHandler:^(RFCResponseParser *parser) {! MasterViewController *tempSelf = blockWeakSelf;! if (! tempSelf) return;! ! [Document sharedDocument].indexArray = parser.indexArray;! [tempSelf _updateSectionIndexArray];! [tempSelf.tableView reloadData];! }];!
37.
休憩
38.
Cocoa勉強会 http://www.cocoa-study.com/
39.
RFCViewerの製作
40.
RFC • 以下にインデックスがある。 http://www.rfc-editor.org/rfc/rfc-index.txt • RFC文書のURL http://www.ietf.org/rfc/rfc四桁の数値.txt 例)http://www.ietf.org/rfc/rfc0821.txt
41.
RFCとは • TCP/IPプロトコルの詳細が記述されて いるレポート。以下に例をあげる。 • 793:
TCPプロトコルの仕様。 • 822: 電子メールの形式。
42.
ファイル構成 アプリケーション・デリゲート テーブル(RFCのインデックス) 詳細画面(RFC文書表示) データ 通信(コネクタ/パーサ)
45.
アプリのデリゲート 通信中インジケータ @implementation AppDelegate- (BOOL)application:(UIApplication
*)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ /* ConnectのnetworkAccessingキーを監視 */ [[Connector sharedConnector] addObserver:self forKeyPath:@networkAccessing options: 0 context:NULL]; return YES;}(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context{ /* networkAccessingキーに変化あり */ if ([keyPath isEqualToString:@networkAccessing]) { [self _updateNetworkActivity]; }}- (void)_updateNetworkActivity{ /* 通信中な らインジケータを表示 */ [UIApplication sharedApplication].networkActivityIndicatorVisible = [Connector sharedConnector].networkAccessing;}@end 真:表示 偽:非表示 ココ
46.
通信開始 - (void)parse{ DBGMSG(@%s, __func__); NSString *urlString
= nil; /* 通信先 */ if (self.index == 0) { /* 目次文書 */ urlString = [Document sharedDocument] .indexUrlString; } else { /* 指定された番号のRFC文書 */ urlString = [[Document sharedDocument] rfcUrlStringWithIndex:self.index]; } /* URLからNSURLRequestのインスタンスを生成 */ NSURLRequest *urlRequest = nil; if (urlString) { NSURL *url; url = [NSURL URLWithString:urlString]; if (url) { urlRequest = [NSURLRequest requestWithURL:url]; } } DBGMSG(@%s urlString(%@), __func__, urlString); if (! urlRequest) { /* NSURLRequestインスタンスの生 成失敗 */ self.networkState = kRFCNetworkStateError; self.error = [self _errorWithCode: kRFCResponseParserGenericError localizedDescription: @NSURLRequestの生成に失敗しました。]; return; } /* 受信データの格納バッファの用意 */ self.downloadedData = [[NSMutableData alloc] init]; / * NSURLConnectionインスタンスの生成 (並列処理の為のキューを設定) */ self.urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self startImmediately:NO]; [self.urlConnection setDelegateQueue:self.queue]; /* 通信中インジケータの更新 */ [self willChangeValueForKey:@networkState]; self.networkState = kRFCNetworkStateInProgress; [self didChangeValueForKey:@networkState]; /* 通信開始 */ [self.urlConnection start];} 前のスライド
47.
受信データの格納 - (void)connection:(NSURLConnection*)connection didReceiveResponse: (NSURLResponse*)response{ /*
デリゲートに通知 */ if ([self.delegate respondsToSelector:@selector(parser:didReceiveResponse:)]) { /* 主スレッドで実行 */ dispatch_async(dispatch_get_main_queue(), ^{ [self.delegate parser:self didReceiveResponse:response]; }); }}(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data{ /* 受信したデータ をバッファに格納 */ [self.downloadedData appendData:data]; /* デリゲートに通知 */ if ([self.delegate respondsToSelector:@selector(parser:didReceiveData:)]) { /* 主スレッドで実行 */ dispatch_async(dispatch_get_main_queue(), ^{ [self.delegate parser:self didReceiveData:data]; }); }}
48.
通信終了 - (void)connectionDidFinishLoading:(NSURLConnection*)connection{ /* 通信中インジケ ータの更新
*/ [self willChangeValueForKey:@networkState]; self.networkState = kRFCNetworkStateFinished; [self didChangeValueForKey:@networkState]; /* 目次文書 */ if (self.index == 0) { /* 受信データのパース */ [self _parseIndexArray]; } /* 主スレ ッドで実行させる */ dispatch_async(dispatch_get_main_queue(), ^{ [self _notifyParserDidFinishLoading]; }); self.urlConnection = nil;}(void)_notifyParserDidFinishLoading{ /* デリゲートに通知 */ if ([self.delegate respondsToSelector:@selector(parserDidFinishLoading:)]) { [self.delegate parserDidFinishLoading:self]; }}
49.
通信を要求する /* 通信中パーサを配列に格納 */ [self.parsers addObject:parser]; /*
通信中インジケータの更新 */ if (networkAccessing != self.networkAccessing) { [self - (void)rfcWithIndex:(NSUInteger)index willChangeValueForKey:@networkAccessing]; [self completionHandler:(RFCResponseParserCompletionHandler) didChangeValueForKey:@networkAccessing]; } /* 通 completionHandler{ BOOL 信開始を通知 */ NSMutableDictionary *userInfo networkAccessing = self.networkAccessing; /* パーサの = [NSMutableDictionary dictionary]; [userInfo インスタンスを生成 */ RFCResponseParser *parser setObject:parser forKey:@parser]; = [[RFCResponseParser alloc] init]; parser.index [[NSNotificationCenter defaultCenter] = index; parser.queue = self.queue; parser.delegate = postNotificationName:ConnectorDidBeginRfc self; parser.completionHandler = object:self userInfo:userInfo];} completionHandler; /* 通信開始 */ [parser parse]; if (parser.error) { /* 通信開始エラー */ NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:parser forKey:@parser]; [[NSNotificationCenter defaultCenter] postNotificationName:ConnectorDidFinishRfc object:self userInfo:userInfo]; if (parser.completionHandler) { parser.completionHandler(parser); } return; }
50.
応答を受け取る - (void)parserDidFinishLoading:(RFCResponseParser *)parser{ if
([self.parsers containsObject:parser]) { [self _notifyRfcStatusWithParser:parser]; }}(void)_notifyRfcStatusWithParser:(RFCResponseParser *)parser{ NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:parser forKey:@parser]; /* 通信完了を通知(通知センター) */ [[NSNotificationCenter defaultCenter] postNotificationName:ConnectorDidFinishRfc object:self userInfo:userInfo]; /* 通信完了を通知(Blocks) */ if (parser.completionHandler) { parser.completionHandler(parser); } /* 通信中インジケータの更新 */ [self willChangeValueForKey:@networkAccessing]; [self.parsers removeObject:parser]; [self didChangeValueForKey:@networkAccessing];}
51.
要求を投げる - (void)viewDidLoad{ [super viewDidLoad]; if
(self.rfc.text) { [self configureView]; } /* RFC文書の取得要求を投げる */ __block DetailViewController * __weak blockWeakSelf = self; [[Connector sharedConnector] rfcWithIndex:[self.rfc.rfcNumber integerValue] completionHandler:^(RFCResponseParser *parser) { /* 応答を受けた際の処理 */ DetailViewController *tempSelf = blockWeakSelf; if (! tempSelf) return; if (parser.rfc) tempSelf.rfc.text = parser.rfc; [tempSelf configureView]; }];}
52.
NSURLSession iOS7で追加された機能で、NSURLConnection に変わるもの。
53.
Demo
54.
AdHoc
55.
Q A
Download