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

相关文章

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi