您的位置:首页 > 其它

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

2015-09-06 22:58 302 查看
请求的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息