Я ищу наиболее оптимальный способ решения следующей проблемы и буду очень признателен за помощь. Я создал собственное приложение реагирования, которое использует redux-saga для управления состоянием и redux-persist для хранения автономных данных.
Проблема: в автономном режиме пользователи должны иметь возможность использовать собственное приложение для создания «сообщений» (ради примера), к которому можно прикрепить несколько изображений. Затем, когда у них есть соединение rnet, они должны иметь возможность нажать кнопку синхронизации / загрузки. Эта кнопка меняет state.offlineQueue.offlineQueueShoud
с 'cache'
на 'sync'
Несколько вещей для рассмотрения; на стороне сервера, у меня есть таблица сообщений и таблица изображений с отношением многие к одному (много изображений к одному сообщению), что означает, что для загрузки изображения на сервер мне нужно передать post_id
; Это означает, что я должен был загрузить сообщение, к которому он «прикреплен», на сервер, чтобы я мог передать post_id
в запросе. Чтобы решить эту часть, у меня есть функция, которая использует временные uuid для поддержания связи между постами и изображениями:
function* postProcessToOfflineQueueSaga (action) {
try {
let post = Object.assign({}, action.payload);
post.uuid = uuid();
post.uploaded = false;
const imagesArr = post.images;
imagesArr.forEach(image => {
image.uuid = uuid();
image.postUuid = post.uuid;
});
post.imageIds = imagesArr.map(image => image.uuid);
delete post.images;
yield put({ type: POST_ADD_TO_OFFLINE_QUEUE, post });
yield put({ type: IMAGE_ADD_TO_OFFLINE_QUEUE, imagesArr });
} catch (error) {
console.log(error)
}
}
, которая затем сохраняет его в состоянии приложения в двух массивах; посты и изображения. Например,
state.offlineQueue.offlinePosts: [
...
{
id: undefined,
uuid: "4df64ee5-29ba-4347-ae30-ee3d5602eae4",
imageIds: [
"62e11ef4-01f7-4052-a3e4-6cd109392818",
"2c7065ef-fed9-457f-950a-08d4224516dd",
],
uploaded: false,
}
...
]
state.offlineQueue.offlineImages: [
...
{
id: undefined,
uuid: "62e11ef4-01f7-4052-a3e4-6cd109392818",
postId: undefined,
postUuid: "4df64ee5-29ba-4347-ae30-ee3d5602eae4",
uploaded: false,
uri: "/path/to/file/on/device",
},
{
id: undefined,
uuid: "2c7065ef-fed9-457f-950a-08d4224516dd",
postId: undefined,
postUuid: "4df64ee5-29ba-4347-ae30-ee3d5602eae4",
uploaded: false,
uri: "/path/to/file/on/device",
},
...
]
state.offlineQueue.offlineQueueShoud: 'cache' // either 'cache' or 'sync'
Итак, как мне go отправить эти данные на сервер? Я думаю следующее:
- Проверьте «offlineQueueShoud» (если «кеш» ничего не делает для экономии батареи?)
- Если
offlineQueueShoud === 'sync'
, сначала выполните итерацию по отправляет массив сообщений и отправляет каждое сообщение на сервер и использует ответ, чтобы мы могли установить post.id и image.postId для сгенерированного сервером идентификатора. - После загрузки всех сообщений начните загружать изображения одно за другим, как мы теперь у вас есть правильный идентификатор сообщения.
- После того, как все сообщения и изображения загружены, очистите список.
Я посмотрел каналы избыточной саги, это лучший способ сделай это? Если да, то как мне сделать так, чтобы, если offlineQueueShoud === 'cache'
не разрядил батарею, и если приложение было закрыто / повторно открыто, данные не терялись. Извиняюсь, если я новичок, я только молод :)
PS Я даже делаю это правильно?!