向服务器请求数据(没有上拉和下拉刷新的情况)注意细节
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方法里面取消,用户体验效果会更好点
进入该控制器界面的时候,使用框架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
相关文章推荐