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的设置也就不再啰嗦了,核心代码也就这么多了,其他的传值也是这么用,来看一下成果吧







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值