Что такое хороший способ обрабатывать асинхронные запросы в ReSwift / Redux - PullRequest
0 голосов
/ 10 июня 2019

Чтобы сделать асинхронный запрос, в этом случае используется промежуточное ПО, которое возвращает ошибку через фиксированный промежуток времени.

Состояние приложения должным образом обновлено, контроллер представления подписчика выдает ошибку.

Однако в следующем случае этот контроллер представления подписчика находит ошибку в состоянии, которое фактически является ошибкой из предыдущего запроса, и отображает сообщение об ошибке еще до того, как запрос будет запущен.

Как работать с этим делом в ReSwift / Redux?

магазин

    let store = Store(
        reducer: appReducer,
        state: AppState(),
        middleware: [requestMiddleware]
    )

Состояние

    struct AppState: StateType {
        var isRequestInProgress = false
        var result: Result<Bool, NSError>?
    }

Действия

    struct RequestAction: Action {}
    struct ReceiveAction: Action {}
    struct ErrorAction: Action {
        let error: NSError
    }

Middleware

    let requestMiddleware: Middleware<Any> = { dispatch, getState in
    return { next in
        return { action in
            switch action {
            case is RequestAction:
                DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
                        store.dispatch(ErrorAction(error: NSError(domain: "", code: -1, userInfo: nil)))
                    })
                default:
                    break
                }

                return next(action)
            }
        }
    }

1021 * Переходник *

    func appReducer(action: Action, state: AppState?) -> AppState {
        var state = state ?? AppState()

        switch action {
        case is RequestAction:
            state.isRequestInProgress = true
        case let action as ErrorAction:
            state.isRequestInProgress = false
            state.result = .failure(action.error)
        default: break
        }

        return state
    }

Приложение

class ViewController: UIViewController {
    @IBAction func presentControllerB(_ sender: Any) {
        guard let viewController = storyboard?.instantiateViewController(withIdentifier: "ViewControllerB") else {
            return
        }

        present(viewController, animated: true)
    }
}

class ViewControllerB: UIViewController, StoreSubscriber {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        store.subscribe(self)
    }

    override func viewWillDisappear(_ animated: Bool) {
        store.unsubscribe(self)
        super.viewWillDisappear(animated)
    }

    func newState(state: AppState) {
        showActivity(state.isRequestInProgress)

        switch state.result {
        case .none:
            break
        case .some(.success(_)):
            break
        case .some(.failure(let error)):
            presentError(error)
            dismiss(animated: true)
        }
    }

    @IBAction func request(_ sender: Any) {
        store.dispatch(RequestAction())
    }

    private func showActivity(_ show: Bool) {}

    private func presentError(_ error: Error) {
        print("Error")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...