Как организовать поток действий-состояний методов загрузки с использованием ReSwift

#ios #swift #redux #reswift

#iOS #swift #сокращение #повторный переход

Вопрос:

Я создаю приложение, используя архитектуру Redux с фреймворком ReSwift, большинство процессов приложений описывается потоком действий — состояний редуктора. Теперь я добавил два метода upload (image: UIImage, fileName: String) и download (fileName: String), которые загружают изображения в хранилище Firebase. Итак, как я могу описать эти методы с использованием Redux flow? Ну, я знаю, как я могу запускать процессы загрузки / выгрузки с использованием промежуточного программного обеспечения, но как я могу получать результаты загрузки / выгрузки в подписчиках магазина?

Ответ №1:

Вы можете создавать действия, которые будут либо сохранять результаты, либо выдавать ошибку, подобную этой:

 struct ImageDownloadStartAction: Action {
    let filename: String
}

struct ImageDownloadSuccessAction: Action {
    let data: Data
}

struct ImageDownloadFailureAction: Action {
    let error: Error
}


struct ImageUploadStartAction: Action {
    let image: UIImage
    let filename: String
}

struct ImageUploadSuccessAction: Action { }

struct ImageUploadFailureAction: Action {
    let error: Error
}
  

Затем в вашем блоке completionHandler or done вы можете использовать dispatch функцию, переданную промежуточному программному обеспечению, для отправки успешного / неудачного действия в основной поток (например, DispatchQueue.main.async ) и использовать значение или ошибку в вашем редукторе.

Например (с помощью PromiseKit ):

 let networkMiddleware: Middleware<AppState> = { dispatch, getState in
    return { next in
        return { action in
            next(action)

            switch action {
            case let action as ImageDownloadStartAction:
                networkService.download(filename: action.filename)
                .done { // automatically called on main thread in PromiseKit
                    dispatch(ImageDownloadSuccessAction(data: $0)
                }
                .catch { // automatically called on main thread in PromiseKit
                    dispatch(ImageDownloadFailureAction(error: $0)
                }

            default:
                break
            }
        }
    }
  

Комментарии:

1. Подобное решение уже есть и реализовано, но спасибо за ответ! PromiseKit блокирует блоки обработчиков вызовов (done, catch, finally) в основном потоке?

2. @zzheads Да, «По умолчанию обработчики PromiseKit выполняются в главном потоке, который является последовательным». github.com/mxcl/PromiseKit/blob/master/Documentation/FAQ.md