【问题标题】:How organize action-state flow of upload/download methods using ReSwift如何使用 ReSwift 组织上传/下载方法的动作状态流
【发布时间】:2019-03-10 19:27:09
【问题描述】:

我正在使用带有 ReSwift 框架的 Redux 架构构建应用程序,大多数应用程序流程由动作 - 减速器 - 状态流描述。 现在我添加了两个方法upload(image: UIImage, fileName: String) 和download(fileName: String),将图像上传和下载到Firebase 存储。 那么,我如何使用 Redux 流来描述这些方法呢? 好吧,我知道如何使用中间件运行下载/上传过程,但是如何在商店订阅者中获得下载/上传结果?

【问题讨论】:

    标签: ios swift redux reswift


    【解决方案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
    }
    

    然后在您的completionHandlerdone 块中,您可以使用传递给中间件的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
                }
            }
        }
    

    【讨论】:

    • 已经获得并实施了这样的解决方案,但感谢您的回答! PromiseKit 在主线程中调用处理程序块(完成、捕获、最终)?
    • @zzheads 是的,“默认情况下,PromiseKit 处理程序在主线程上运行,它是串行的”。 github.com/mxcl/PromiseKit/blob/master/Documentation/FAQ.md
    猜你喜欢
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多