您的当前位置:首页正文

采用MJ刷新最新数据和加载历史数据

来源:华拓网

刷新代码地址

  • 友情提示: 遇到一些小问题, 最好及时下载最新的代码试试

自定义tabview

    #pragma mark  主视图
    -(void)initWithTableView
     {
     _homeTableView=[[HomeTableView alloc]initWithFrame:CGRectMake(0, NAVIGATIONBAR_HEIGHT, kScreenWidth, kScreenHeight-TABBAR_HEIGHT-NAVIGATIONBAR_HEIGHT) style:UITableViewStylePlain];
     _homeTableView.backgroundColor=UICOLORBEIJING;
     [self.view addSubview:_homeTableView];
       //调用刷新按钮
     [self setupRefresh];
     }

判断网络连接情况

在调用下面方法时需在工程中导入包SystemConfiguration.framework,方法返回Yes时表示有网连接,返回No时表示没有网连接

    #pragma mark  网络显示情况
     - (BOOL)connectedToNetwork{
      //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
     struct sockaddr_storage zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.ss_len = sizeof(zeroAddress);
    zeroAddress.ss_family = AF_INET;
    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
    //获得连接的标志
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
    //如果不能获取连接标志,则不能连接网络,直接返回
    if (!didRetrieveFlags)
    {
    return NO;
    }
    //根据获得的连接标志进行判断
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    return (isReachable&&!needsConnection) ? YES : NO;
    }

定义刷新

定义刷新,在自定义tabview方法中调用

#pragma mark  设立上拉刷新下拉加载
- (void)setupRefresh
{
//下拉加载
[_homeTableView addHeaderWithTarget:self action:@selector(headerRereshing) dateKey:@"table"];
//刷新开始
[_homeTableView headerBeginRefreshing];
//上拉加载
[_homeTableView addFooterWithTarget:self action:@selector(footerRereshing)];
//定义刷新文字
_homeTableView.headerPullToRefreshText = @"下拉可以刷新";
_homeTableView.headerReleaseToRefreshText = @"松开马上刷新";
_homeTableView.headerRefreshingText = @"刷新中。。。";
_homeTableView.footerPullToRefreshText = @"上拉可以加载更多数据";
_homeTableView.footerReleaseToRefreshText = @"松开马上加载更多数据";
_homeTableView.footerRefreshingText = @"加载中。。。";
}

数据源(首次加载数据量)

  • 在这里首次加载自动加载十条数据,从bmob后台数据库中通过for循环选择十条数据进行加载

  • 其中有两个关键if 第一个是判断有无网络连接,第二个是判断当网络不好时调用方法

    #pragma mark  数据源
    -(void)_loadData
    {
    if ([self connectedToNetwork]) {
    //数据源
    HomeModel *home=[[HomeModel alloc]init];
      //tablview数据
      BmobQuery *bquery=[BmobQuery queryWithClassName:@"Merchants"];
      [bquery orderByDescending:@"createdAt"];
      [bquery findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
          //主视图
          self.a=(int)array.count;
          //主要tabview主视图是在这里调用,避免代码块回调后没有数据存在
          [self initWithTableView];
          NSMutableArray *arrM5=[NSMutableArray array];
          if (array.count==0) {  
              UIAlertController *alertroller=[UIAlertController alertControllerWithTitle:@"提示" message:@"当前网络不好" preferredStyle:UIAlertControllerStyleAlert];
              [alertroller addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
              }]];
              [self presentViewController:alertroller animated:YES completion:nil];
              self.Wangluo=NO;
          }else
          {
              //选择十条数据加载
              for (int i=0; i<10; i++) {
                  [arrM5 addObject:array[i]];
              }
          }
          //进行数据解析
          NSMutableArray *arrM=[home HomeWithBmob:arrM5];
          _homeTableView.dataList=arrM;
          //刷新tabview数据
          [_homeTableView reloadData];
       }];
     }
    else{
        UIAlertController *alertroller=[UIAlertController alertControllerWithTitle:@"提示" message:@"请检查网络连接" preferredStyle:UIAlertControllerStyleAlert];
      [alertroller addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
      }]];
      [self presentViewController:alertroller animated:YES completion:nil];
      [_homeTableView headerEndRefreshing];
    }
      [MBProgressHUD hideHUDForView:_homeTableView animated:YES];
    }
    

下拉刷新方法

  • 在定义刷新中调用

  • 当后台数据库添加新数据,下拉刷新会将原有数据源中的数组和请求数组进行比较,如果有新数据,会通过判断加载最新数据。

      #pragma mark  下拉可以刷新
      - (void)headerRereshing
      {
      if ([self connectedToNetwork]) {
      HomeModel *home=[HomeModel new];
      BmobQuery *bquery=[BmobQuery queryWithClassName:@"Merchants"];
      [bquery orderByDescending:@"createdAt"];
      [bquery findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
          if (array.count==self.a) {
          //创建隐藏按钮
              self.YingChangBeiJing=[[UIView alloc]initWithFrame:self.view.frame];
              self.YingChangBeiJing.backgroundColor=[UIColor blackColor];
              self.YingChangBeiJing.alpha=.2;
              [self.view addSubview:self.YingChangBeiJing];
              self.ShanglaSuanxin=[[UIImageView alloc]init];
              self.ShanglaSuanxin.frame=CGRectMake((kScreenWidth-100)/2, (kScreenHeight-100)/2, 100, 100);
              self.ShanglaSuanxin.layer.cornerRadius=20;
              self.ShanglaSuanxin.layer.masksToBounds=YES;
              self.ShanglaSuanxin.backgroundColor=[UIColor whiteColor];
              self.ShanglaSuanxin.image=[UIImage imageNamed:@"shuaxin3"];
              
              [self.view addSubview:self.ShanglaSuanxin];
              
              [NSTimer scheduledTimerWithTimeInterval:0.8 target:self selector:@selector(timechange) userInfo:nil repeats:NO];
              [_homeTableView headerEndRefreshing];
          }else
          {
              if (self.Wangluo==NO) {
                  NSString *str=[NSString stringWithFormat:@"刷新成功"];
                  UIAlertController *alertroller=[UIAlertController alertControllerWithTitle:@"提示" message:str preferredStyle:UIAlertControllerStyleAlert];
                  [alertroller addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                  }]];
                  [self presentViewController:alertroller animated:YES completion:nil];
                  NSMutableArray *arrM5=[NSMutableArray array];
                  for (int i=0; i<10; i++) {
                      [arrM5 addObject:array[i]];
                  }
                  NSMutableArray *arrM=[home HomeWithBmob:arrM5];
                  _homeTableView.dataList=arrM;
                  [_homeTableView reloadData];
                  [_homeTableView headerEndRefreshing];
                  if (arrM5!=0) {
                      self.Wangluo=YES;
                  }
              }
              else
              {
              int a=(int)(array.count-self.a);
                  self.YingChangBeiJing=[[UIView alloc]initWithFrame:self.view.frame];
                  self.YingChangBeiJing.backgroundColor=[UIColor blackColor];
                  self.YingChangBeiJing.alpha=.2;
                  [self.view addSubview:self.YingChangBeiJing];
                  self.ShanglaSuanxin=[[UIImageView alloc]initWithFrame:CGRectMake((kScreenWidth-100)/2, (kScreenHeight-100)/2, 100, 100)];
                  self.ShanglaSuanxin.layer.cornerRadius=20;
                  self.ShanglaSuanxin.layer.masksToBounds=YES;
                  self.ShanglaSuanxin.backgroundColor=[UIColor whiteColor];
                  self.ShanglaSuanxin.image=[UIImage imageNamed:@"shuaxin2"];
                  [self.view addSubview:self.ShanglaSuanxin];
                  [NSTimer scheduledTimerWithTimeInterval:0.8 target:self selector:@selector(timechange) userInfo:nil repeats:NO];
              NSMutableArray *arrMNew=[NSMutableArray array];
              for (int i=0; i<a; i++) {
              [arrMNew addObject:array[i]];
              }
              self.a=(int)array.count;
              NSMutableArray *arr=[home HomeWithBmob:arrMNew];
              for (int i=0; i<a; i++) {
                  [_homeTableView.dataList insertObject:arr[i] atIndex:0];
              }
              [_homeTableView reloadData];
              [_homeTableView headerEndRefreshing];
             }
          }
      }];
      }
      else{
      UIAlertController *alertroller=[UIAlertController alertControllerWithTitle:@"提示" message:@"请检查网络连接" preferredStyle:UIAlertControllerStyleAlert];
      [alertroller addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
      }]];
      [self presentViewController:alertroller animated:YES completion:nil];
      [_homeTableView headerEndRefreshing];
       }
       [MBProgressHUD hideHUDForView:_homeTableView animated:YES];
       }
    

上拉加载

     #pragma mark  上拉加载
     - (void)footerRereshing
     {
     if ([self connectedToNetwork]) {
    self.count++;
    //数据源
    HomeModel *home=[[HomeModel alloc]init];
    //tablview数据
    BmobQuery *bquery=[BmobQuery queryWithClassName:@"Merchants"];
    [bquery orderByDescending:@"createdAt"];
    [bquery findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
        if (array.count/10<self.count) {
            self.YingChangBeiJing=[[UIView alloc]initWithFrame:self.view.frame];
            self.YingChangBeiJing.backgroundColor=[UIColor blackColor];
            self.YingChangBeiJing.alpha=.2;
            [self.view addSubview:self.YingChangBeiJing];
            self.ShanglaSuanxin=[[UIImageView alloc]initWithFrame:CGRectMake((kScreenWidth-100)/2, (kScreenHeight-100)/2, 100, 100)];
            self.ShanglaSuanxin.layer.cornerRadius=20;
            self.ShanglaSuanxin.layer.masksToBounds=YES;
            self.ShanglaSuanxin.backgroundColor=[UIColor whiteColor];
            self.ShanglaSuanxin.image=[UIImage imageNamed:@"shuaxin1"];
            [self.view addSubview:self.ShanglaSuanxin];
            [NSTimer scheduledTimerWithTimeInterval:0.8 target:self selector:@selector(timechange) userInfo:nil repeats:NO];
            [_homeTableView footerEndRefreshing];
             }else
        {
            NSMutableArray *arrM5=[NSMutableArray array];
            if (array.count/10==self.count) {
                for (int i=self.count*10; i<=self.count*10+array.count%10-1;i++) {
                    [arrM5 addObject:[array objectAtIndex:i]];
                }
            }else
            {
                for (int i=self.count*10; i<self.count*10+10;i++) {
                    [arrM5 addObject:[array objectAtIndex:i]];
                }
            }
        NSMutableArray *arrM=[home HomeWithBmob:arrM5];
        [_homeTableView.dataList addObjectsFromArray:arrM];
        [_homeTableView reloadData];
        [_homeTableView footerEndRefreshing];
        }
    }];
     }else{
    UIAlertController *alertroller=[UIAlertController alertControllerWithTitle:@"提示" message:@"请检查网络连接" preferredStyle:UIAlertControllerStyleAlert];
    [alertroller addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    }]];
    [self presentViewController:alertroller animated:YES completion:nil];
    [_homeTableView footerEndRefreshing];
     }
     }

规定时间内删除隐藏图片

  #pragma mark  上拉刷新移除背景视图
  -(void)timechange
  {
   [self.ShanglaSuanxin removeFromSuperview];
   [self.YingChangBeiJing removeFromSuperview];
  }

图片展示

屏幕快照 2016-05-25 下午3.03.11.png Simulator Screen Shot 2016年5月25日 下午3.03.29.png Simulator Screen Shot 2016年5月25日 下午3.04.21.png Simulator Screen Shot 2016年5月25日 下午3.04.46.png Simulator Screen Shot 2016年5月25日 下午3.05.18.png