React Nativeのキャッシュとダウンロード
8289 ワード
一般的には、3つのデータのキャッシュとダウンロードが必要です.純粋なテキスト(APIの戻り、ステータスタグなど)、ピクチャキャッシュ、その他の静的ファイルなどです.
プレーンテキスト
純粋なテキストは比較的簡単で、RN公式モジュール
データの取得
iOSでは,は、 を見つけて について説明します.
画像
もし1つの画像を1回ロードしたことがあるならば、次回また使う時私はもう1回ロードしたくなくて、直接キャッシュから読むことができるほうがいいです.公式コンポーネント
react-native-cached-image
公式ガイドに従ってインストールすることができます.私はあまり言いません.しかし、このライブラリはreact-native-fetch-blobに依存していることに注意してください.これはnativeモジュールで、
react-native-fast-image
キャッシュを制御するために3つのモードが予め設定されています.そのうちの1つは
その他の静的ファイル
pdf,mp 3,mp 4などの静的ファイルをデバイスにダウンロードまたはキャッシュする必要がある場合があります.
このパスを手に入れると直接使えます
このライブラリではファイルのアップロードもサポートできます
ダウンロードとアップロードの過程で、彼の進捗状況を得ることもできます.
注意しなければならないのは、
このファイルがすでにダウンロードされているかどうかを確認します.
使い終わったらこのファイルを削除して、同時に記録を削除することもできます.
プレーンテキスト
純粋なテキストは比較的簡単で、RN公式モジュール
AsyncStorage
で十分です.HTML 5の中のLocalStorage
と同じように、setItem
とgetItem
を直接調整してデータを操作することができます.この2つの方法はpromiseを返します.次の例は、データのキャッシュです._storeData = async () => {
try {
await AsyncStorage.setItem('@MySuperStore:key', 'I like to save it.');
} catch (error) {
// Error saving data
}
};
データの取得
_retrieveData = async () => {
try {
const value = await AsyncStorage.getItem('TASKS');
if (value !== null) {
// We have data!!
console.log(value);
}
} catch (error) {
// Error retrieving data
}
};
iOSでは,
AsyncStorage
はnativeコードで実現され,小さなデータであればシーケンス化辞書に存在し,データ量が大きすぎると単独でファイルを格納する.Androidでは、AsyncStorage
がRocksDBまたはSQLiteを使用しており、現在のデバイスがどのデバイスをサポートしているかによって異なります.注意が必要なのは、Androidにはサイズ制限があり、最大6 MBしか保存できません.これはRN公式のわざとで、ここのソースコードを見ることができます.必要に応じて、この制限を上書きできます./android/app/src/main/java/MainApplication.java
を見つけ、ReactDatabaseSupplier
をインポートします.import com.facebook.react.modules.storage.ReactDatabaseSupplier;
インポート後、このファイルはこのように見えます:import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;
import com.facebook.react.modules.storage.ReactDatabaseSupplier;
onCreate
を設定し、新しいmaximumSize
を設定します.ここでは50 MBlong size = 50L * 1024L * 1024L; // 50 MB
ReactDatabaseSupplier.getInstance(getApplicationContext()).setMaximumSize(size);
に設定します.変更後のonCreate
はこのように見えます.大きなデータを保存する必要がある場合は、ファイルとして保存できます.後で画像
もし1つの画像を1回ロードしたことがあるならば、次回また使う時私はもう1回ロードしたくなくて、直接キャッシュから読むことができるほうがいいです.公式コンポーネント
Image
には、いくつかのキャッシュをサポートできる属性cache
がありますが、iOSのみをサポートしています.ここでは比較的ポピュラーなライブラリreact-native-cached-imageとreact-native-fast-imageを2つ探しましたreact-native-cached-image
公式ガイドに従ってインストールすることができます.私はあまり言いません.しかし、このライブラリはreact-native-fetch-blobに依存していることに注意してください.これはnativeモジュールで、
yarn add
またはnpm install
を実行した後、あなたのプロジェクトにリンクする必要があります.最も簡単なのはreact-native link react-native-fetch-blob
自動リンクを実行することです.プロジェクト構造が自動リンクと異なる場合は、手動リンクが必要です.ここを参照してください.このライブラリには、CachedImage
,ImageCacheProvider
およびImageCacheManager
の3つの比較的有用なコンポーネントがあります.これは公式の例です.@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
long size = 50L * 1024L * 1024L; // 50 MB
ReactDatabaseSupplier.getInstance(getApplicationContext()).setMaximumSize(size);
}
ImageCacheManager
はキャッシュを制御するために使用され、画像をダウンロードおよび削除することができ、ダウンロード画像の物理アドレスを取得することもできます.キャッシュ優先、強制リフレッシュ、強制キャッシュというプリセットルールは使用できません.具体的には、自分で定義する必要があります.react-native-fast-image
react-native-fast-image
もっと簡単に使えます.GitHubの星も少し多いです.これはnativeライブラリで、iOSではSDWebImage、AndroidではパッケージのGlide(Android)で、どちらも原生上万星のライブラリです.nativeライブラリですので、インストール後もリンクが必要ですが、具体的な方法は上記と同じです.これは使用例です.import React from 'react';
import {
CachedImage,
ImageCacheProvider
} from 'react-native-cached-image';
const images = [
'https://example.com/images/1.jpg',
'https://example.com/images/2.jpg',
'https://example.com/images/3.jpg',
// ...
];
export default class Example extends React.Component {
render() {
return (
console.log('hey there')}>
);
}
}
キャッシュを制御するために3つのモードが予め設定されています.そのうちの1つは
FastImage.cacheControl.web
です.この戦略はウェブページが同じです.彼はHTTPのキャッシュ制御ヘッドを採用して制御します.フロントエンドの開発者はよく知っているはずです.このライブラリの公式には多くの例が見られますが、ここを見てください.画像キャッシュを作るなら、これをお勧めします.その他の静的ファイル
pdf,mp 3,mp 4などの静的ファイルをデバイスにダウンロードまたはキャッシュする必要がある場合があります.
rn-fetch-blob
は、あなたのHTTPをファイルとしてデバイス上に存在するnativeライブラリに戻すことができます.彼は実はreact-native-fetch-blob
だったが、react-native-fetch-blob
は維持を続けなかったので、forkが名前を変えて維持を続けた.要求された構成にfileCache : true
を設定すると、彼は戻り値をファイルとして保存し、物理パスに戻ります.デフォルトで保存されているファイルには接尾辞名がありません.パラメータを加えて接尾辞を設定することができます.例えば、appendExt : 'zip'
import FastImage from 'react-native-fast-image'
const YourImage = () =>
このパスを手に入れると直接使えます
RNFetchBlob
.config({
// add this option that makes response data to be stored as a file,
// this is much more performant.
fileCache : true,
appendExt : 'zip'
})
.fetch('GET', 'http://www.example.com/file/example.zip', {
Authorization : 'Bearer access-token...',
//some headers ..
})
.then((res) => {
// the temp file path
console.log('The file saved to ', res.path())
})
このライブラリではファイルのアップロードもサポートできます
imageView =
ダウンロードとアップロードの過程で、彼の進捗状況を得ることもできます.
RNFetchBlob.fetch('POST', 'https://content.dropboxapi.com/2/files/upload', {
// dropbox upload headers
Authorization : "Bearer access-token...",
'Dropbox-API-Arg': JSON.stringify({
path : '/img-from-react-native.png',
mode : 'add',
autorename : true,
mute : false
}),
'Content-Type' : 'application/octet-stream',
// Change BASE64 encoded data to a file path with prefix `RNFetchBlob-file://`.
// Or simply wrap the file path with RNFetchBlob.wrap().
}, RNFetchBlob.wrap(PATH_TO_THE_FILE))
.then((res) => {
console.log(res.text())
})
.catch((err) => {
// error handling ..
})
注意しなければならないのは、
rn-fetch-blob
はあなたのダウンロード履歴を記録しません.つまり、アプリを消してから開くと、ダウンロードしたファイルがどこにあるか分かりません.AsyncStorage
でダウンロードの履歴を記録することができます.ダウンロードが完了したら、アドレスをAsyncStorage
:RNFetchBlob.fetch('POST', 'http://www.example.com/upload', {
//... some headers,
'Content-Type' : 'octet-stream'
}, base64DataString)
// listen to upload progress event
.uploadProgress((written, total) => {
console.log('uploaded', written / total)
})
.then((resp) => {
// ...
})
.catch((err) => {
// ...
})
RNFetchBlob
.config({
// add this option that makes response data to be stored as a file,
// this is much more performant.
fileCache : true,
appendExt : 'zip'
})
.fetch('GET', 'http://www.example.com/file/example.zip', {
Authorization : 'Bearer access-token...',
//some headers ..
})
// listen to download progress event
.progress((received, total) => {
console.log('progress', received / total)
})
.then((res) => {
// the temp file path
console.log('The file saved to ', res.path())
})
このファイルがすでにダウンロードされているかどうかを確認します.
RNFetchBlob
.config({
fileCache: true,
appendExt: 'pdf',
})
.fetch('GET', 'http://pdf.dfcfw.com/pdf/H3_AP201901271289150621_1.pdf')
.then((response) => {
const path = response.path();
this.setState({
cachedFile: path,
});
AsyncStorage.setItem('fileCache', path);
})
.catch((error) => {
this.setState({
error,
});
});
使い終わったらこのファイルを削除して、同時に記録を削除することもできます.
componentDidMount() {
AsyncStorage.getItem('fileCache').then((data) => {
this.setState({
cachedFile: data,
});
});
}