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

相关文章

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

springboot3.4和mybatis plus的版本问题的解决

《springboot3.4和mybatisplus的版本问题的解决》本文主要介绍了springboot3.4和mybatisplus的版本问题的解决,主要由于SpringBoot3.4与MyBat... 报错1:spring-boot-starter/3.4.0/spring-boot-starter-

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基