RxSwift+Moya+Moya_ObjectMapper+MJRefresh,刷新失败?

Posted

技术标签:

【中文标题】RxSwift+Moya+Moya_ObjectMapper+MJRefresh,刷新失败?【英文标题】:RxSwift+Moya+Moya_ObjectMapper+MJRefresh, refresh failed? 【发布时间】:2017-06-19 14:41:27 【问题描述】:

我是 RxSwift 的新手。 我想刷新 tableview 以显示新数据。我可以获取数据的第一个请求。但是当我拉下 tableview 时,请求没有完成。我对此没有任何想法?我的代码如下:

1:我的viewController的代码:

class RecommendViewController: UIViewController 

lazy var tableView = DefaultManager.createTableView(HomeImageCell.self, 
                                                    HomeImageCell.idenfitier)
let disposeBag = DisposeBag()
lazy var viewModel = HomeViewModel()
lazy var dataSource: [HomeListDetailModel] = []

override func viewDidLoad() 
    super.viewDidLoad()
    viewModel.fetchRecommendList("answer_feed",0)
    setupTableView()
    configureRefresh()
    bindDataToTableView()


func setupTableView() 
    view.addSubview(tableView)
    tableView.snp.makeConstraints  (make) in
        make.edges.equalTo(0)
    
    tableView.estimatedHeight(200)


func bindDataToTableView() 
    viewModel.recommend
        .observeOn(MainScheduler.instance)
        .do(onNext:  [unowned self] model in
            print("endAllRefresh")
            self.endAllRefresh()
        , onError:  (error) in
            self.endAllRefresh()
            print("error = \(error)")
        )
        .map  [unowned self] model in
            return self.handleData(model)
        .bind(to: tableView.rx.items(cellIdentifier: HomeImageCell.idenfitier , cellType: HomeImageCell.self ))  index, model, cell in
            cell.updateCell(data: model)
        .disposed(by: disposeBag)


func configureRefresh() 
    tableView.mj_header = MJRefreshNormalHeader(refreshingBlock:  [unowned self] in
        let model = self.dataSource[0]
        self.viewModel.fetchRecommendList("answer_feed",model.behot_time)

    )
    tableView.mj_footer = MJRefreshAutoNormalFooter(refreshingBlock:  [unowned self] in
        let model = self.dataSource[self.dataSource.count - 1]
        self.viewModel.fetchRecommendList("answer_feed",model.behot_time)
    )


func endAllRefresh() 
    self.tableView.mj_header.endRefreshing()
    self.tableView.mj_footer.endRefreshing()


func handleData(_ model: HomeListModel) -> [HomeListDetailModel] 
    guard let data = model.detailData else 
        return dataSource
    
    self.dataSource = data
    return data


2:我的视图模型

protocol HomeProtocol 
    func fetchRecommendList(_ category: String, _ behot_time: Int) 


class HomeViewModel: HomeProtocol  
    lazy var provider = HTTPServiceProvider.shared
    var recommend: Observable<HomeListModel>!

    init() 

    init(_ provider: RxMoyaProvider<MultiTarget>) 
       self.provider = provider
    

    func fetchRecommendList(_ category: String, _ behot_time: Int) 
        recommend = provider.request(MultiTarget(HomeAPI.homeList(category: category,behot_time: behot_time)))
        .debug()
        .mapObject(HomeListModel.self)
     
 

当我在请求方法处下断点时,它没有发出请求?有人知道吗?先谢谢

【问题讨论】:

【参考方案1】:

有人告诉我原因,所以我写在这里。在我的 ViewModel 中,recommend 应该得到 PublishSubjectBehaviourSubjectReplaySubject 的支持,然后我应该将 View 分享为 Observable。在fetchRecommentList 方法中,我应该将请求绑定到创建的Subject。 现在我已经创建了 observable,但是请求将在 subsribebind 之后运行

【讨论】:

以上是关于RxSwift+Moya+Moya_ObjectMapper+MJRefresh,刷新失败?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift + Moya + ObjectMapper

使用 Moya + RxSwift 处理自定义错误响应

RxSwift/Moya - 如果通过函数返回序列将不会启动

如何使用 Moya RxSwift 合并 REST 数组

处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)

moya 与 RxSwift 使用