Suche senden
Hochladen
Repository pattern in swift
•
1 gefällt mir
•
1,467 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
リアクティブプログラミングとMVVMパターンについて
リアクティブプログラミングとMVVMパターンについて
Hidenori Takeshita
三層式架構設計
三層式架構設計
Clark
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
dcubeio
ドメイン駆動設計入門
ドメイン駆動設計入門
増田 亨
Laravelの検索機能の実装方法
Laravelの検索機能の実装方法
yoshitaro yoyo
Laravel 9 comprendre les fondamentaux.
Laravel 9 comprendre les fondamentaux.
Valdy Ngouabira
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
dcubeio
Railsで作るBFFの功罪
Railsで作るBFFの功罪
Recruit Lifestyle Co., Ltd.
Empfohlen
リアクティブプログラミングとMVVMパターンについて
リアクティブプログラミングとMVVMパターンについて
Hidenori Takeshita
三層式架構設計
三層式架構設計
Clark
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
dcubeio
ドメイン駆動設計入門
ドメイン駆動設計入門
増田 亨
Laravelの検索機能の実装方法
Laravelの検索機能の実装方法
yoshitaro yoyo
Laravel 9 comprendre les fondamentaux.
Laravel 9 comprendre les fondamentaux.
Valdy Ngouabira
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
dcubeio
Railsで作るBFFの功罪
Railsで作るBFFの功罪
Recruit Lifestyle Co., Ltd.
画面状態を抽象化してテスタブル設計ライフを送ろう
画面状態を抽象化してテスタブル設計ライフを送ろう
Hiroshi Kikuchi
Prism + ReactiveProperty入門
Prism + ReactiveProperty入門
一希 大田
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
Wangeun Lee
Event Storming and Implementation Workshop
Event Storming and Implementation Workshop
uEngine Solutions
Spring Framework - Core
Spring Framework - Core
Dzmitry Naskou
Java Server Faces (JSF)
Java Server Faces (JSF)
Heithem Abbes
クロスドメインアクセスを理解してWeb APIを楽しく使おう
クロスドメインアクセスを理解してWeb APIを楽しく使おう
kitfactory
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
FlutterでGraphQLを扱う
FlutterでGraphQLを扱う
IgaHironobu
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
kwatch
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Akito Tsukahara
L'API Collector dans tous ses états
L'API Collector dans tous ses états
José Paumard
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Formation JAVA/J2EE
Formation JAVA/J2EE
Ines Ouaz
クラウドネイティブトランスフォーメーションのススメ
クラウドネイティブトランスフォーメーションのススメ
Hiromasa Oka
SwiftUI와 TCA로 GitHub Search앱 만들기
SwiftUI와 TCA로 GitHub Search앱 만들기
규영 허
CleanArchitecture with AssemblyDefinition in unity
CleanArchitecture with AssemblyDefinition in unity
NakanoYosuke1
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
Google Cloud Platform - Japan
cours j2ee -présentation
cours j2ee -présentation
Yassine Badri
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
Weeklycms20120218
Weeklycms20120218
Yoshi Sakai
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
Mikiya Okuno
Weitere ähnliche Inhalte
Was ist angesagt?
画面状態を抽象化してテスタブル設計ライフを送ろう
画面状態を抽象化してテスタブル設計ライフを送ろう
Hiroshi Kikuchi
Prism + ReactiveProperty入門
Prism + ReactiveProperty入門
一希 大田
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
Wangeun Lee
Event Storming and Implementation Workshop
Event Storming and Implementation Workshop
uEngine Solutions
Spring Framework - Core
Spring Framework - Core
Dzmitry Naskou
Java Server Faces (JSF)
Java Server Faces (JSF)
Heithem Abbes
クロスドメインアクセスを理解してWeb APIを楽しく使おう
クロスドメインアクセスを理解してWeb APIを楽しく使おう
kitfactory
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
FlutterでGraphQLを扱う
FlutterでGraphQLを扱う
IgaHironobu
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
kwatch
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Akito Tsukahara
L'API Collector dans tous ses états
L'API Collector dans tous ses états
José Paumard
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Formation JAVA/J2EE
Formation JAVA/J2EE
Ines Ouaz
クラウドネイティブトランスフォーメーションのススメ
クラウドネイティブトランスフォーメーションのススメ
Hiromasa Oka
SwiftUI와 TCA로 GitHub Search앱 만들기
SwiftUI와 TCA로 GitHub Search앱 만들기
규영 허
CleanArchitecture with AssemblyDefinition in unity
CleanArchitecture with AssemblyDefinition in unity
NakanoYosuke1
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
Google Cloud Platform - Japan
cours j2ee -présentation
cours j2ee -présentation
Yassine Badri
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
Was ist angesagt?
(20)
画面状態を抽象化してテスタブル設計ライフを送ろう
画面状態を抽象化してテスタブル設計ライフを送ろう
Prism + ReactiveProperty入門
Prism + ReactiveProperty入門
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
Event Storming and Implementation Workshop
Event Storming and Implementation Workshop
Spring Framework - Core
Spring Framework - Core
Java Server Faces (JSF)
Java Server Faces (JSF)
クロスドメインアクセスを理解してWeb APIを楽しく使おう
クロスドメインアクセスを理解してWeb APIを楽しく使おう
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
FlutterでGraphQLを扱う
FlutterでGraphQLを扱う
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
L'API Collector dans tous ses états
L'API Collector dans tous ses états
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Formation JAVA/J2EE
Formation JAVA/J2EE
クラウドネイティブトランスフォーメーションのススメ
クラウドネイティブトランスフォーメーションのススメ
SwiftUI와 TCA로 GitHub Search앱 만들기
SwiftUI와 TCA로 GitHub Search앱 만들기
CleanArchitecture with AssemblyDefinition in unity
CleanArchitecture with AssemblyDefinition in unity
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
cours j2ee -présentation
cours j2ee -présentation
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
Ä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