向服务器请求数据(没有上拉和下拉刷新的情况)注意细节

  • 请求的AFN管理者用weak修饰,因为AFN框架已经在合适处强引用了它,让AFN管理它的生命周期

  • 进入该控制器界面的时候,使用框架SVProgressHUD.h 并调用方法:[SVProgressHUD show]提示用户正在加载数据

  • 利用AFNetworking.h框架向服务器发送get请求,回调block里面使用到控制器即(self)需要用__weak typeOf(self) weakSelf = self,并在block里面使用weak修饰的控制器,因为:当网速慢的时候,请求的回调block执行较慢,而当用户退出该控制器的时候,控制器本应该从内存中释放,不用weak修饰,就会造成,控制器对象延迟释放,用weak修饰,当退出该控制器的时候,控制器就会立马释放(没有被block里面强应用),此时weakself就会成为nil空指针

  • 在数据请求成功并成功刷新表格后,要关闭弹框: [SVProgressHUD dismiss];

  • 若是请求失败

    • 1.请求超时(失败码-1001,error.code):需利用弹框提示用户请求超时
    • 2.AFN文件管理者中途取消了所有请求,直接返回,不用弹框提示
    • 3.其余情况,可以弹框提示
  • 当用户离开当前控制器界面的时候,即控制器要从内存中释放的时候,一定要将所有发送的请求取消:[self.manager invalidateSessionCancelingTasks:YES];

  • 当用户离开当前控制器界面时候,要取消弹框,在viewWillDisappear里面[SVProgressHUD dismiss];比在控制器的dealloc方法里面取消,用户体验效果会更好点

//  XMGTagViewController.m
//  3期-百思不得姐
//
//  Created by xiaomage on 15/9/1.
//  Copyright (c) 2015年 xiaomage. All rights reserved.
//

#import "XBTagViewController.h"
#import "XBTagCell.h"
#import <AFNetworking.h>
#import <MJExtension.h>
#import "XBTag.h"
#import <SVProgressHUD.h>

@interface XBTagViewController ()
/** 所有的标签数据(里面存放的都是XMGTag模型) */
@property (nonatomic, strong) NSArray *tags;
#warning 注意manager用weak
/** 请求管理者(用weak因为AFN已经强引用了它) */
@property (nonatomic, weak) AFHTTPSessionManager *manager;
@end

@implementation XMGTagViewController

/** cell的循环利用标识 */
static NSString * const XMGTagCellId = @"tag";

- (AFHTTPSessionManager *)manager
{
    if (!_manager) {
        _manager = [AFHTTPSessionManager manager];
    }
    return _manager;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"推荐标签";

    [self setupTable];

    [self loadTags];
}

- (void)setupTable
{
    self.tableView.backgroundColor = XMGCommonBgColor;
    // 设置行高
    self.tableView.rowHeight = 70;

    // 去掉系统自带的分割线
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    // 注册cell
    [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([XMGTagCell class]) bundle:nil] forCellReuseIdentifier:XMGTagCellId];
}

- (void)loadTags
{
    // 弹框
    [SVProgressHUD show];

    // 加载标签数据
    // 请求参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"tag_recommend";
    params[@"action"] = @"sub";
    params[@"c"] = @"topic";

    // 发送请求
#warning 注意一般第三方框架里面block里面用到控制器self,要weak该控制器
    XMGWeakSelf;
    [self.manager GET:XMGRequestURL parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
        if (responseObject == nil) { // 可能输入请求url域名正确但是参数不对,这时服务器也会响应成功,只是返回数据位nil

            // 关闭弹框
            [SVProgressHUD showErrorWithStatus:@"加载标签数据失败"];
            return;
        }

        // responseObject:字典数组
        // weakSelf.tags:模型数组
        // responseObject -> weakSelf.tags
        weakSelf.tags = [XMGTag objectArrayWithKeyValuesArray:responseObject];

        // 刷新表格
        [weakSelf.tableView reloadData];

        // 关闭弹框
        [SVProgressHUD dismiss];
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        // 如果是取消了任务,就不算请求失败,就直接返回 (取消了请求也会来到failure里面)
        // 错误码:中途取消请求 kCFURLErrorCancelled = -999
        if (error.code == NSURLErrorCancelled) return;

        if (error.code == NSURLErrorTimedOut) { // 错误码:延时   kCFURLErrorTimedOut = -1001,
            // 关闭弹框
            [SVProgressHUD showErrorWithStatus:@"加载标签数据超时,请稍后再试!"];
        } else {
            // 关闭弹框
            [SVProgressHUD showErrorWithStatus:@"加载标签数据失败"];
        }
    }];
}

#warning 当控制器挂的时候,取消所有的请求操作:注意:务必要加上这部操作,不会崩掉,如果block里面没有使用弱引用控制器,会延迟挂掉
- (void)dealloc
{
    // 停止请求
    [self.manager invalidateSessionCancelingTasks:YES];

}

- (void)viewWillDisappear:(BOOL)animated
{
#warning 在即将消失界面的时候取消弹框,用户体验更好
    [SVProgressHUD dismiss];
    [super viewWillDisappear:animated];
}
#pragma mark - <UITableViewDataSource>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.tags.count;
}

/**
 * 返回indexPath位置对应的cell
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    XMGTagCell *cell = [tableView dequeueReusableCellWithIdentifier:XMGTagCellId];

    cell.tagModel = self.tags[indexPath.row];

    return cell;
}
@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值