MJRefresh
MJRefresh copied to clipboard
[Async]MJRefreshComponent 暴露属性, 导致 StateHeader/Footer 某些方法在特殊情况下失效. (异步主线程问题)
你好,你将刷新状态都放到异步主线程中,如果外部直接设置state(暴露了接口),这样顺序上就有问题了,导致外部设置state无效了
你内部代码如下: #pragma mark 结束刷新状态
- (void)endRefreshing { dispatch_async(dispatch_get_main_queue(), ^{ self.state = MJRefreshStateIdle; }); } 我外部代码: strongSelf.tableView.mj_footer.endRefreshing() strongSelf.tableView.mj_footer.state = .noMoreData 如果我这样写的话,就有问题,建议不要暴露state属性,或者设置为只读
你提的问题非常的好 👍, 的确暴露 state 出来不太好. 不应该给外部修改这个属性.
但是你的用法也是有问题的. 你应该这样写你的代码
tableView.mj_footer.endRefreshingWithNoMoreData()
並且现阶段的 State 状态机 有缺陷, 的确在这样的特殊误用情况下会产生问题
原因是: 状态机中某些操作时依赖 DispatchQueue 的异步分发, 导致有微延迟, 而某些改变状态时又未使用异步分发
我也遇到这个奇怪的问题了,把异步主线程给注释掉 就没有问题了,不知道 这里为什么要加异步主线程
我也遇到这个奇怪的问题了,把异步主线程给注释掉 就没有问题了,不知道 这里为什么要加异步主线程
直接调用endRefreshing,然后再外部获取isRefreshing,并不能准确获得到,而调用endRefreshingWithCompletionBlock是可以的