Suche senden
Hochladen
Repository pattern in swift
•
1 gefällt mir
•
1,465 views
naoty_bot
Folgen
potatotips #28
Weniger lesen
Mehr lesen
Software
Melden
Teilen
Melden
Teilen
1 von 25
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
ジラフとアンニカの写真撮影機能の制作事例
ジラフとアンニカの写真撮影機能の制作事例
Kami pallet
Unity In App Purchase (IAP)の使い方
Unity In App Purchase (IAP)の使い方
Makoto Ito
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
UnityTechnologiesJapan002
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
健一 辰濱
画面状態を抽象化してテスタブル設計ライフを送ろう
画面状態を抽象化してテスタブル設計ライフを送ろう
Hiroshi Kikuchi
Assembly Definition あれやこれ
Assembly Definition あれやこれ
NakanoYosuke1
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
Unity Technologies Japan K.K.
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
U-dai Yokoyama
Empfohlen
ジラフとアンニカの写真撮影機能の制作事例
ジラフとアンニカの写真撮影機能の制作事例
Kami pallet
Unity In App Purchase (IAP)の使い方
Unity In App Purchase (IAP)の使い方
Makoto Ito
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
UnityTechnologiesJapan002
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
健一 辰濱
画面状態を抽象化してテスタブル設計ライフを送ろう
画面状態を抽象化してテスタブル設計ライフを送ろう
Hiroshi Kikuchi
Assembly Definition あれやこれ
Assembly Definition あれやこれ
NakanoYosuke1
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
Unity Technologies Japan K.K.
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
U-dai Yokoyama
iBeaconを身近に!アプリ開発の基礎とポイント
iBeaconを身近に!アプリ開発の基礎とポイント
leverages_event
Epic Online Services でできること
Epic Online Services でできること
エピック・ゲームズ・ジャパン Epic Games Japan
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
Unity Technologies Japan K.K.
VueとAWSAppSyncで始めるチャットアプリ開発
VueとAWSAppSyncで始めるチャットアプリ開発
Ryosuke Izumi
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Shohei Okada
Androidの表示レイヤーと画面常駐型アプリの話
Androidの表示レイヤーと画面常駐型アプリの話
kirimin
FullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + Angular
Loiane Groner
知らないと損するアプリ開発におけるStateMachineの活用法(full版)
知らないと損するアプリ開発におけるStateMachineの活用法(full版)
Ken Morishita
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
Fumihiko Shiroyama
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
Unity Technologies Japan K.K.
Jenkins 再入門
Jenkins 再入門
Jumpei Miyata
Appium 2.0 ではじめるモバイルアプリテスト
Appium 2.0 ではじめるモバイルアプリテスト
Masayuki Wakizaka
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
KageShiron
【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現
Unity Technologies Japan K.K.
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
ProjectAsura
Blender で作ったアニメーションを Unreal Engine 4 で利用する
Blender で作ったアニメーションを Unreal Engine 4 で利用する
rarihoma
취미로 엔진 만들기
취미로 엔진 만들기
Jiho Choi
【Unite Tokyo 2019】AWS for Unity Developers
【Unite Tokyo 2019】AWS for Unity Developers
UnityTechnologiesJapan002
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
Weeklycms20120218
Weeklycms20120218
Yoshi Sakai
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
Mikiya Okuno
Weitere ähnliche Inhalte
Was ist angesagt?
iBeaconを身近に!アプリ開発の基礎とポイント
iBeaconを身近に!アプリ開発の基礎とポイント
leverages_event
Epic Online Services でできること
Epic Online Services でできること
エピック・ゲームズ・ジャパン Epic Games Japan
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
Unity Technologies Japan K.K.
VueとAWSAppSyncで始めるチャットアプリ開発
VueとAWSAppSyncで始めるチャットアプリ開発
Ryosuke Izumi
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Shohei Okada
Androidの表示レイヤーと画面常駐型アプリの話
Androidの表示レイヤーと画面常駐型アプリの話
kirimin
FullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + Angular
Loiane Groner
知らないと損するアプリ開発におけるStateMachineの活用法(full版)
知らないと損するアプリ開発におけるStateMachineの活用法(full版)
Ken Morishita
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
Fumihiko Shiroyama
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
Unity Technologies Japan K.K.
Jenkins 再入門
Jenkins 再入門
Jumpei Miyata
Appium 2.0 ではじめるモバイルアプリテスト
Appium 2.0 ではじめるモバイルアプリテスト
Masayuki Wakizaka
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
KageShiron
【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現
Unity Technologies Japan K.K.
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
ProjectAsura
Blender で作ったアニメーションを Unreal Engine 4 で利用する
Blender で作ったアニメーションを Unreal Engine 4 で利用する
rarihoma
취미로 엔진 만들기
취미로 엔진 만들기
Jiho Choi
【Unite Tokyo 2019】AWS for Unity Developers
【Unite Tokyo 2019】AWS for Unity Developers
UnityTechnologiesJapan002
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
Was ist angesagt?
(20)
iBeaconを身近に!アプリ開発の基礎とポイント
iBeaconを身近に!アプリ開発の基礎とポイント
Epic Online Services でできること
Epic Online Services でできること
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
VueとAWSAppSyncで始めるチャットアプリ開発
VueとAWSAppSyncで始めるチャットアプリ開発
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Androidの表示レイヤーと画面常駐型アプリの話
Androidの表示レイヤーと画面常駐型アプリの話
FullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + Angular
知らないと損するアプリ開発におけるStateMachineの活用法(full版)
知らないと損するアプリ開発におけるStateMachineの活用法(full版)
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
Jenkins 再入門
Jenkins 再入門
Appium 2.0 ではじめるモバイルアプリテスト
Appium 2.0 ではじめるモバイルアプリテスト
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
Blender で作ったアニメーションを Unreal Engine 4 で利用する
Blender で作ったアニメーションを Unreal Engine 4 で利用する
취미로 엔진 만들기
취미로 엔진 만들기
【Unite Tokyo 2019】AWS for Unity Developers
【Unite Tokyo 2019】AWS for Unity Developers
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Ähnlich wie Repository pattern in swift
Weeklycms20120218
Weeklycms20120218
Yoshi Sakai
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
Mikiya Okuno
Php5.4
Php5.4
ke-m kamekoopa
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
Takeru INOUE
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
JavaScriptとCollection
JavaScriptとCollection
Kazuhiro Karino
Rユーザのためのspark入門
Rユーザのためのspark入門
Shintaro Fukushima
CodeIgniter入門
CodeIgniter入門
Sho A
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
朋哉 池田
PHPフレームワーク入門
PHPフレームワーク入門
Sho A
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
Tetsuya Morimoto
Ajax 応用
Ajax 応用
Katsuyuki Seino
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Tasuku Otani
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
Kenjiro Kubota
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
Mitsuru Katoh
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
おすすめ gem
おすすめ gem
chocoby
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
Ryuji Yamashita
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
Masatoshi Tada
Ähnlich wie Repository pattern in swift
(20)
Weeklycms20120218
Weeklycms20120218
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
Php5.4
Php5.4
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
JavaScriptとCollection
JavaScriptとCollection
Rユーザのためのspark入門
Rユーザのためのspark入門
CodeIgniter入門
CodeIgniter入門
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
PHPフレームワーク入門
PHPフレームワーク入門
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
Ajax 応用
Ajax 応用
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
おすすめ gem
おすすめ gem
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
Repository pattern in swift
1.
Naoto Kaneko Repository pattern in
Swift
2.
3.
リポジトリパターン • リポジトリとは、データの取得、保存、削除のため のインターフェイス • リポジトリを使ってデータにアクセスする。 •
メモリ、Realm、APIといったバックエンドを知 る必要がなくなる。
4.
ViewController RecipeRepository WebAPIRecipeRepository RealmRecipeRepository query model params
JSON NSPredicate RealmObject
5.
in Swift protocol RecipeRepository
{ func find(id: UInt) -> Recipe? func findAll(query: Query, sort: Sort) -> [Recipe] func save(recipes: [Recipe]) -> Recipe? func delete(recipes: [Recipe]) -> Recipe? }
6.
in Swift class MemoryRecipeRepository:
RecipeRepository { let recipes = [ Recipe(id: 1, name: “…”), Recipe(id: 2, name: “…”), Recipe(id: 3, name: “…”), ] func find(id: UInt) -> Recipe? { recipes.filter { $0.id == id }.first } }
7.
問題点 • データへのアクセスはだいたい非同期 • クエリやソートはどうやって指定するのか •
RecipeRepository, ChefRepository, UserRepository…と似たようなコードをコピペ することになりそう
8.
リポジトリで非同期処理を あつかう
9.
Promise protocol RecipeRepository { func
find(id: UInt) -> Task<Void, Recipe, ErrorType> func findAll(query: Query, sort: Sort) -> Task<Void, [Recipe], ErrorType> func save(recipes: [Recipe]) -> Task<Void, Recipe, ErrorType> func delete(recipes: [Recipe]) -> Task<Void, Recipe, ErrorType> }
10.
ViewController RecipeRepository WebAPIRecipeRepository RealmRecipeRepository query model params
JSON NSPredicate RealmObject
11.
ViewController RecipeRepository WebAPIRecipeRepository RealmRecipeRepository Task<Void, Model,
Error> params JSON NSPredicate RealmObject query
12.
汎用的なクエリを定義する
13.
naoty/AnyQuery let query =
AnyQuery.Equal(key: “name”, value: “naoty”) query.predicate //=> NSPredicate(format: "name == ‘naoty’") query.dictionary //=> ["name": “naoty”] let sort = AnySort.Ascending(key: “id”) sort.sortDescriptors //=> [NSSortDescriptor(key: "id", ascending: true)] sort.dictionary //=> ["sort": ["id"]]
14.
naoty/AnyQuery protocol RecipeRepository { func
find(id: UInt) -> Task<Void, Recipe, ErrorType> func findAll(query: AnyQuery, sort: AnySort) -> Task<Void, [Recipe], ErrorType> func save(recipes: [Recipe]) -> Task<Void, Recipe, ErrorType> func delete(recipes: [Recipe]) -> Task<Void, Recipe, ErrorType> }
15.
ViewController RecipeRepository WebAPIRecipeRepository RealmRecipeRepository Task<Void, Model,
Error> params JSON NSPredicate RealmObject query
16.
ViewController RecipeRepository WebAPIRecipeRepository RealmRecipeRepository Task<Void, Model,
Error> [String: AnyObject] JSON NSPredicate RealmObject AnyQuery
17.
汎用的なリポジトリ型 を定義する
18.
これはできない protocol Repository { associatedtype
Domain func find(id: Uint) -> Task<Void, Domain, ErrorType> } let repository: Repository = MemoryRecipeRepository()
19.
型消去 struct AnyRepository<DomainType>: Repository
{ let _find: (id: UInt) -> Task<Void, DomainType, ErrorType> init<T: Repository where T.Domain == DomainType>(_ repository: T) { _find = repository.find } func find(id: UInt) -> Task<Void, DomainType, ErrorType> { return _find(id) } } let repository = AnyRepository(MemoryRecipeRepository()) // repository: AnyRepository<Recipe>
20.
ViewController RecipeRepository WebAPIRecipeRepository RealmRecipeRepository Task<Void, Model,
Error> [String: AnyObject] JSON NSPredicate RealmObject AnyQuery
21.
ViewController AnyRepository<Recipe> WebAPIRecipeRepository RealmRecipeRepository Task<Void, Model,
Error> [String: AnyObject] JSON NSPredicate RealmObject AnyQuery
22.
実装例 • https://github.com/naoty/Playground/ tree/master/Repository
23.
応用例: キャッシュ
24.
キャッシュ • リポジトリから取得した結果をキャッシュしたい。 • キャッシュになければ別のリポジトリから取得して、 キャッシュに保存した上で返す。 •
キャッシュにあれば返す。 • 例: ログインユーザーの取得など
25.
ありがとうございました
Jetzt herunterladen