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

相关文章

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr