热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

请求的AFN管理者用weak修饰,因为AFN框架已经在合适处强引用了它,让AFN管理它的生命周期进入该控制器界面的时候,使用框架SVProgressHUD.h并调用方法:[SV
  • 请求的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 
#import 
#import "XBTag.h"
#import 

@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 - 
- (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

推荐阅读
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 使用 MyEclipse 和 TestNG 测试框架在 Java 中高效进行单元测试
    通过MyEclipse集成TestNG测试框架,可以在Java开发中高效地进行单元测试。本文介绍了在JDK 1.8.0_121和MyEclipse 10.0离线环境下配置和使用TestNG的具体步骤,帮助开发者提高测试效率和代码质量。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 如何在 Java LinkedHashMap 中高效地提取首个或末尾的键值对? ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • Java 9 中 SafeVarargs 注释的使用与示例解析 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • Python网络爬虫入门:利用urllib库进行数据抓取
    Python网络爬虫入门:利用urllib库进行数据抓取在数据科学和Web开发领域,Python凭借其简洁高效的特性成为首选语言。本文主要介绍了如何在Windows环境下使用Python的urllib库进行基本的网络数据抓取。考虑到命令行操作的不便,作者选择了Jupyter Notebook作为开发环境,不仅简化了配置过程,还提供了直观的数据处理和可视化功能。通过实例演示,读者可以轻松掌握urllib的基本用法,为深入学习网络爬虫技术打下坚实基础。 ... [详细]
author-avatar
郭昊天886688
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有