Slide

20
2014 7 25 TeshGym akuraru

description

viewとmodel

Transcript of Slide

Page 1: Slide

2014年7月25日

TeshGym

akuraru

Page 2: Slide

1 自己紹介• Name: akuraru

• Website: いつもあさって!!

Page 3: Slide

2 今日話すこと• ViewはModelの写像であるということをはなします– MVCの概要– 独自のデザインパターン

• 対象– CoreDataを使っている

Page 4: Slide

3 MVC• 機能ごとの分離を明確にすることでそれぞれを独立性を確保できる。

• それぞれのライブラリを使って実装する• 再利用性を上げる

Page 5: Slide

4 MVC

Page 6: Slide

5 画面の描画

Page 7: Slide

6 画面の描画

Page 8: Slide

7 画面の描画- (void)updateView {

self.model = [Model MR_findFirst];

self.subView = [self createSubView];

[self.subView setModel:self.model];

[self.view addSubView:self.subView];

}

1. コントローラはモデルを読み込む

2. Viewを生成する

3. ViewにModelを反映させる

Page 9: Slide

8 画面の描画- (void)updateView {

self.model = [Model MR_findFirst];

[self.subView setModel:self.model];

}

1. コントローラはモデルを読み込む

2. Viewを生成する

3. ViewにModelを反映させる

Page 10: Slide

9 TableViewの描画- (UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath{

Model *model = [self modelForIndexPath:indexPath];id cell = [tableView dequeueReusableCellWithIdentifier:

[self identifierForEntity:model]];[cell setModel:model];return cell;

}

1. コントローラはモデルを読み込む

2. Viewを生成する

3. ViewにModelを反映させる

Page 11: Slide

10 ここまでのまとめ• ViewはModelの写像

Page 12: Slide

11 Modelの変更• Viewの変更すればModelに反映させる• ManagedObjectの扱いに注意が必要

Page 13: Slide

12 Modelの変更• コンテキストがひとつの場合、Modelを変更した場合戻すのが大変。

• 戻さずに別のコンテキストを保存すると変更が保存されてしまう。

• コンテキストを複数扱えるほど頭良くない

Page 14: Slide

13 Modelの変更• Wrapper Objectというパターン– 編集画面でのViewの変更を即座に反映する

Modelに反映する– 戻す手間を減らすため

※ Wrapper Objectは造語であって一般的な言葉ではない

Page 15: Slide

14 Wrapper Object

• ManagedObjectと同じプロパティを持つ。• コンテキストを増やさずに、変更可能なManagedObjectとして振る舞う

• ManagedObjectを格納している• 実際に保存する段階になってManagedObject

に反映させる

Page 16: Slide

15 日記の例え• 例えば日記アプリでタイトル、本文が保存できるとする。

@interface Diary : NSManagedObject@property (nonatomic, strong) NSString *title;@property (nonatomic, strong) NSString *content;@end

Page 17: Slide

16 日記のラッパー@interface DiaryWrapper@property (nonatomic, strong) NSString *title;@property (nonatomic, strong) NSString *content;@property (readonly, nonatomic, strong) Diary *entity;

// Diary又はnilを受け取って、wrapperを初期化する- (instancetype)initWithDiary:(Diary *)entity;

// 渡されたDiaryに対してラッパーの状態を反映させる- (void)updateDiary:(Diary *)entity;@end

Page 18: Slide

17 なぜ使うのか• 一つのコンテキストを扱う• 変更しやすいManagedObjectのように振る舞う。

• Wrapperに対して変更を加えてもManagedObjectには影響しない

• 変更を反映したくなければWrapperを捨てればいい

Page 19: Slide

18 まとめ• Wrapper Objectを紹介しました• 変更しやすいManagedObject

Page 20: Slide

19 コードhttps://github.com/akuraru/TechGym