Вы можете создать действия, которые будут содержать результаты или ошибку, например:
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
или 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
}
}
}