下拉上拉细节处理

利用一个下面这个例子,来解决在使用刷新控件时网络延迟问题

这是一个tableView显示网络请求的数据

1.相关属性

@interface DDZJokeViewController ()

/** 获取的数据 */
@property (nonatomic,strong) NSMutableArray *jokeData;

/** 存储maxtime */
@property (nonatomic,copy) NSString *maxTime;

/** 页码 */
@property (nonatomic,assign) NSInteger page;

/** 存储上一次的请求 */
@property (nonatomic,strong) NSDictionary *params;

@end

2.初始化

- (NSMutableArray *)jokeData {
    if (!_jokeData) {
        _jokeData = [NSMutableArray array];
    }
    return _jokeData;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    //加载刷新控件
    [self loadRefresh];
}

3.相关的方法

/**
 * 加载刷新控件
 */
- (void)loadRefresh {
    //设置默认下拉刷新
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewJoke)];
    //根据拖拽比例自动切换透明度
    self.tableView.mj_header.automaticallyChangeAlpha = YES;

    //一进入就加载
    [self.tableView.mj_header beginRefreshing];

    //设置上拉刷新
    self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreJoke)];
}

因为上拉和下拉同时存在,所以,你要考虑到在网络延迟时,用户可能会同时做这两个操作

需要处理这些细节:

//加载下拉段子
- (void)loadNewJoke {

    //先结束上拉
    [self.tableView.mj_footer endRefreshing];

    //请求参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"list";
    params[@"c"] = @"data";
    params[@"type"] = @29;

    self.params = params;

    //加载数据
    [[AFHTTPSessionManager manager] GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary *responseObject) {

        //当数据返回回来时,发现请求参数已经更改,那就直接返回
        if(self.params != params) return;

        //存下maxtime
        self.maxTime = responseObject[@"info"][@"maxtime"];

        //字典->模型
        self.jokeData = [DDZJoke mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];

        //刷新数据
        [self.tableView reloadData];

        [self.tableView.mj_header endRefreshing];

        //页码
        self.page = 0;
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if(self.params != params) return;
        [self.tableView.mj_header endRefreshing];
    }];
}

上拉下拉都要将请求参数进行一次保存,在数据返回时进行一次判断,如果请求参数发生改变了,那就将这次的请求结果丢弃

//加载下拉段子
- (void)loadNewJoke {

    //先结束上拉
    [self.tableView.mj_footer endRefreshing];

    //请求参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"list";
    params[@"c"] = @"data";
    params[@"type"] = @29;

    self.params = params;

    //加载数据
    [[AFHTTPSessionManager manager] GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary *responseObject) {

        //当数据返回回来时,发现请求参数已经更改,那就直接返回
        if(self.params != params) return;

        //存下maxtime
        self.maxTime = responseObject[@"info"][@"maxtime"];

        //字典->模型
        self.jokeData = [DDZJoke mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];

        //刷新数据
        [self.tableView reloadData];

        [self.tableView.mj_header endRefreshing];

        //页码
        self.page = 0;
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if(self.params != params) return;
        [self.tableView.mj_header endRefreshing];
    }];
}

4.tableView的代理方法

#pragma mark - <UITableViewDataSource>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.jokeData.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString * ID = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }

    DDZJoke *dict = self.jokeData[indexPath.row];
    cell.textLabel.text = dict.name;
    cell.detailTextLabel.text = dict.text;
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:dict.profile_image] placeholderImage:[UIImage imageNamed:@"defaultUserIcon"]];

    return cell;
}
时间: 2024-10-17 02:54:37

下拉上拉细节处理的相关文章

完美解决微信下拉上拉

转http://note.youdao.com/share/?id=f13df2c846cac5d4f0e24a715d8372a6&type=note#/ 完美解决微信下拉上拉回弹 1.使用jroll.js完美解决,下载jroll.js. 2.DOM结构为: class container 为滑动页面 3.添加css #wrapper { position: absolute; top: 44px; bottom: 0; width: 100%; } 4.编写js <script src=

微信小程序-ios系统-下拉上拉出现白色,如何处理呢?

这几天做小程序,有些页面都是全屏的背景,在安卓上背景是固定的,而在ios上上拉下拉出现白色,测试说体验不太好,一开始我以为是下拉上拉刷新造成的,关闭了依然是这样.为了体验好点,可以按一下解决: 方式一: 可以在page.json文件内配置 :"backgroundColor": "#ccc" 属性,这个方法比较便捷.但是对于一些全屏背景的页面体验还不是很好 方式二: 对于一些全屏背景页面,我们可以让背景固定这样体验会好点,可以按以下进行操作: 1>page.j

清新大气的ListView下拉上拉刷新--第三方开源--PullDownListView

下载地址:https://github.com/guojunyi/PullDownListView 使用: xml: <com.pulldownlistview.PullDownListView android:id="@+id/pullDownListView" android:layout_width="match_parent" android:layout_height="match_parent" android:backgrou

玩转 H5 下拉上滑动效

按照上面的技术方案实施,具体过程为: 禁用页面顶部下拉事件  ------>  将页面的主体内容用一个DIV容器包含起来,同时复制需要放大处理的内容节点至主体内容之外  ------> 绑定页面滑屏事件  ------> 计算滑屏偏移量以及缩放等数值的运算  ------> 根据变化数值主体内容transfrom下滑,同时复制的节点做放大动效处理  ------> 监听滑屏事件结束,执行回弹动效,还原初始状态 代码节选片段: 要点及说明: 1.禁用页面顶部下拉事件: 该技术要

js 判断屏幕下拉上滑操作

var startX = startY = endX = endY = 0; var body = document.getElementById("dind"); body.addEventListener('touchstart', function(event){ var touch = event.targetTouches[0]; //滑动起点的坐标 startX = touch.pageX; startY = touch.pageY; // console.log(&quo

Android下拉上滑显示与隐藏Toolbar另一种实现

public abstract class RecyclerViewScrollListener extends RecyclerView.OnScrollListener { private static final int SCROLL_DISTANCE = 50; private int totalScrollDistance; private boolean isShow = true; @Override public void onScrollStateChanged(Recycle

上拉加载下拉刷新控件WaterRefreshLoadMoreView

效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on 13-9-18. // #import <UIKit/UIKit.h> #define kStartTo 0.7f #define kEndTo 0.15f #define kAnimationInterval (1.0f / 50.0f) NS_INLINE CGFloat distansBetween(CGPoint p1 , CGPoint p2) { ret

Android 下拉刷新上拉加载 多种应用场景 超级大放送(上)

转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这里不是介绍怎么去实现下拉刷新上拉加载,而是针对下拉刷新上拉加载常用的一些应用场景就行了一些总结,包含了下拉刷新上拉加载过程中遇到的一些手势冲突问题的解决方法(只能算是抛砖引玉). 去年9月的时候,那时自己正在独立做Android项目.记得刚刚写完那个ListView列表页面(木有下拉刷新,上拉加载)

retrofit+rxjava+recyclerview+下拉刷新+自动加载更多

安卓开发过程中,网络请求与下拉刷新分页列表的控件几乎可以说是必不可少的,但是每次开发一款产品都要重新开发,肯定是不可取的,那么最好是可以自己整理一个开发框架,那么以后开发,直接引入项目即可 网络框架的封装,从httpclient,到xutils,再到volley,再到okhttp,每次整合都发现多多少少的不足,目前自己觉得最成熟的一个也就是retrofit+okhttp3+rxjava的组合,rxjava不懂的推荐看大神的深入浅出rxjava,retrofit的使用自己网上搜咯 下拉刷新列表的实