GitHubClientAppWithGraphQL
- GitHub API v4を利用したリポジトリを検索できるアプリ
- GraphQL + apollo-iosのサンプル
- apollo-iosでキャッシュを制御するサンプルコードをシェア
- キャッシュポリシーによる挙動の違いを動作確認
GitHubAccountのtokenが必要なのでこちらから作成してください。
トークン入力画面 |
検索画面(未取得状態) |
検索画面(取得状態) |
![Simulator Screenshot - iPhone 14 Pro - 2023-08-14 at 09 53 22](https://private-user-images.githubusercontent.com/57483158/260338889-1eed837a-2864-4118-a992-0e2ef631c185.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwNTQ5NDgsIm5iZiI6MTcxODA1NDY0OCwicGF0aCI6Ii81NzQ4MzE1OC8yNjAzMzg4ODktMWVlZDgzN2EtMjg2NC00MTE4LWE5OTItMGUyZWY2MzFjMTg1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDIxMjQwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQzOTg2NGM2NTUyNTllMDUxYmE0MDgwM2FjYjAwZmJhYjkyZDk0NzE1ZmE3MTIyMTQ2ZjdjYWJkZGM0YWRiNjUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.NWCdUnv8zflvn-ye-vdbhZc0dRUl80MKLKJkeSQnyUY) |
![Simulator Screenshot - iPhone 14 Pro - 2023-08-10 at 17 21 40](https://private-user-images.githubusercontent.com/57483158/260338980-f4aad89d-5918-4060-90f0-3b1cdac858d5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwNTQ5NDgsIm5iZiI6MTcxODA1NDY0OCwicGF0aCI6Ii81NzQ4MzE1OC8yNjAzMzg5ODAtZjRhYWQ4OWQtNTkxOC00MDYwLTkwZjAtM2IxY2RhYzg1OGQ1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDIxMjQwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc3NDVjNTYyODg5NjNmNGZiMDVhYmYzMTUxYmUwNGEzYzFjNDljMWQwMTkxYzI2NzNiYjJmZTcyMWQxMjcwZmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.suG2GEvvnyBrLC4wkto6AaSFyEuwnE4Dk3L-PBW9Oqo) |
![Simulator Screenshot - iPhone 14 Pro - 2023-08-10 at 17 28 45](https://private-user-images.githubusercontent.com/57483158/260338955-7deae303-c6c4-4100-a6f5-63524263802c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwNTQ5NDgsIm5iZiI6MTcxODA1NDY0OCwicGF0aCI6Ii81NzQ4MzE1OC8yNjAzMzg5NTUtN2RlYWUzMDMtYzZjNC00MTAwLWE2ZjUtNjM1MjQyNjM4MDJjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDIxMjQwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIyM2Q4MTc3NzY5NTQ3YmY1ZmM3YTdhOTcyMmEzOWIwZDllYWVmN2YwYmRmNzBjN2NmNGE1MDdmOGRkYmEyZWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Kc8F5Nun9J5mgjAJH4YzForujC1E_7PbIbgKtovp05Q) |
ユーザーデフォルトにトークンがない場合に表示
|
|
トークン入力フィールド |
ユーザーデフォルトから初期値を取得 |
set!! ボタン |
ユーザーデフォルトにセット |
- メモリキャッシュ:
InMemoryNormalizedCache
を使ったApolloClientを利用
- SQLiteキャッシュ:
SQLiteNormalizedCache
を使ったApolloClientを利用
|
|
検索ワード |
初期値 "swift" |
CachePolicy |
初期値 "returnCacheDataElseFetch" |
|
選択しているCachePolicyの説明 |
Clientメソッド |
fetch: API or キャッシュ(CachePolicyによる)からリポジトリのリストを取得 |
|
read cache: キャッシュからリポジトリのリストを取得 |
|
clear cache: キャッシュを削除する |
clear list |
画面が保持しているリポジトリのリストを削除して未取得状態にする |
リポジトリ一覧 |
画面が保持しているリポジトリのリストを表示 |
reset token |
ユーザデフォルトに保存されているトークンを削除(トークン入力画面に表示切り替え) |
APIから取得するのか、キャッシュから取得するのか制御
- CachePolicyによっては最新の取得をできないケースがある
- 例えば
returnCacheDataElseFetch
だと、キャッシュがある場合は必ずキャッシュから取得する
- キャッシュを削除すればできるが、オフライン時にキャッシュを表示したい場合などを考慮すると、必要なキャッシュが無い瞬間ができてしまう
- オフライン時はAPIでの取得を試さず(エラーのアラートが出てしまうなどを回避したい)にいきなりキャッシュから取得したいケース
- キャッシュポリシー
fetchIgnoringCacheData
を選択
- APIを使う場合は
fetch
, キャッシュから取得したい場合はread
- キャッシュから取得した結果、キャッシュがない場合に自動でAPIから取得する挙動はないので、使う側で判定してfetch