iOS开发-------网络请求(自定义请求管理类,解决在Block中传值问题)

本文主要是介绍iOS开发-------网络请求(自定义请求管理类,解决在Block中传值问题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        目前学到了网络请求,并且也会用AFNetworking类库进行Json的解析,但是想大家也会想,每次都在ViewController获取请求,似乎有些繁琐,那么能不能单独写一个类,直接返回我请求出来的数据呢,这个当然是可以的。

    

        对于这个办法,楼主第一个想法就是在自定义Manager类中加一个数组属性,我只需要在viewController中直接用get方法 得到数据,就可以得到数据了,相信不只我会有这个想法,当然这种想法很好,但是是不切实际的,先给大家一段代码,当然下面的代码是没有办法进行传值的:目的是获取所有的国家的名称信息

/***  加载国家数组*/
-(void *)loadCountry
{//初始化数组self.country = [NSArray array];//自定义字典NSDictionary * dict = @{@"access_token":token};__block __weak CountryManager * copy_self = self;//获取数据[self.operationManager GET:countryURL parameters:dict success:^void(AFHTTPRequestOperation * operaton, NSData * data) {NSError * error;//通过Json形式copy_self.country = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];//为自身的国家属性赋值//如果出错if (error){NSLog(@"error = %@",[error localizedDescription]);}} failure:^void(AFHTTPRequestOperation * operation, NSError * error) {NSLog(@"error = %@",[error localizedDescription]);}];
}

       如果我们想用这种方法进行传值,获取的数组只能在block代码块中有值,一旦出了代码块,也就是我们在viewController中用该方法,自以为是附上了值,但数组的值是@[],也就是一个没有任何值的数组,相信用该方法的人也都意识到了,那是因为Block代码块中我们修改的属性值或者成员变量的值是没法传到外面的,与C语言的函数相似但是不同,那么我们该怎么解决这个问题呢,解决代码块的方法自然就要用代码块


1、首先需要在CountryManager.h中声明代码块

//声明代码块
typedef void(^COY)(NSArray * array);
//获取国家信息的方法
-(void)loadCountry:(COY)coy;

2、在CountryManager.m文件中用延展声明如下属性

//
//  CountryManager.m
//  网络请求(自定义请求管理类,解决在Block中传值问题)(博客)
//
//  Created by YueWen on 15/9/15.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//#import "CountryManager.h"
#import "AFNetworking.h"
#import "Information.h"@interface CountryManager ()//AFNetWorking 包中的网络请求管理类
@property(nonatomic,strong)AFHTTPRequestOperationManager * operationManager;//用来存国家的类
@property(nonatomic,strong)NSArray * country;@end

3、我们在.m中来实现方法

/***  获取请求国家的方法**  @param coy 传数组的代码块*/
-(void)loadCountry:(COY)coy
{//初始化数组self.country = [NSArray array];//自定义字典NSDictionary * dict = @{@"access_token":token};__block __weak CountryManager * copy_self = self;//开始请求[self.operationManager GET:countryURL parameters:dict success:^void(AFHTTPRequestOperation * operation, NSData * data) {NSError * error;//通过Json形式解析数据copy_self.country = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];//如果出错if (error){NSLog(@"%@",[error localizedDescription]);}//接下来就是传值的过程了coy(copy_self.country);} failure:^void(AFHTTPRequestOperation * operation, NSError * error) {NSLog(@"error = %@",[error localizedDescription]);}];}

4、那么我们可以在viewController中来用我们传出的数组了,如下

首先声明

//
//  TableViewController.m
//  网络请求(自定义请求管理类,解决在Block中传值问题)(博客)
//
//  Created by YueWen on 15/9/15.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//#import "TableViewController.h"
#import "Information.h"
#import "CountryManager.h"@interface TableViewController ()@property(nonatomic,strong)CountryManager * countryManager;
@property(nonatomic,strong)NSArray * countryData;//存储国家数据的数组@end

其次就是我们在viewDidLoad中来用了

#pragma mark - 自身的加载方法
- (void)viewDidLoad {[super viewDidLoad];//初始化国家的数组self.countryData = [NSArray array];//设置导航的标题self.navigationItem.title = @"国家";//创建CountryManager单例self.countryManager = [CountryManager shareCountryManager];//避免强引用循环__block __weak TableViewController * copy_self = self;//开始获取数据[self.countryManager loadCountry:^(NSArray *array) {//赋值copy_self.countryData = array;//刷新tableView[copy_self.tableView reloadData];}];}

下面tableView的设置也就不再啰嗦了,核心代码也就这么多了,其他的传值也是这么用,来看一下成果吧







这篇关于iOS开发-------网络请求(自定义请求管理类,解决在Block中传值问题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/242960

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va