ios 块语法和函数指针实现回调

代码实现:

RootViewController类的实现:

View Code
//
//  RootViewController.m
//  HttpRequestByBlockTest
//  方法1:通过块(Block)实现回调-本质是函数指针
//  方法2:通过函数指针实现回调
//  Created by hanjun on 13-3-15.
//  Copyright (c) 2013年 CompanyOfHanJun. All rights reserved.
//

#import "RootViewController.h"
#import "HttpRequst.h"

@interface RootViewController ()

@end

@implementation RootViewController

void (*pFunc2) (NSData *data);

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self createControl];
}

- (void)createControl{
    
    HttpRequst *request = [[HttpRequst alloc] init];
    
    //    [request requestDataFormBlock:^(NSData *data) {//方法1:1.通过块语法向网络类发送函数指针,请求处理
    //        NSLog(@"backData:%@",data);//方法1:6.得到发送过来的消息,回调结束!
    //    }];
    
    pFunc2 = getData;//方法2:1.让pFunc2函数指针指向getData函数
    
    [request requestDataFromFunctionPointer:pFunc2];//方法2:2.把函数指针传给网络处理类
}

//方法2:7.网络类调用该方法,并把消息发送过来,回调结束!
void getData(NSData * data){
    NSLog(@"backData:%@",data);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

HttpRequest类的实现:

View Code
#import <Foundation/Foundation.h>

@interface HttpRequst : NSObject<NSURLConnectionDataDelegate,NSURLConnectionDelegate>{
    NSMutableData *_receiverData;
}

- (void)requestDataFormBlock:(void (^)(NSData * data))getData;

- (void)requestDataFromFunctionPointer:(void (*)(NSData * data))getData;

@end
View Code
//
//  HttpRequst.m
//  HttpRequestByBlockTest
//
//  Created by hanjun on 13-3-15.
//  Copyright (c) 2013年 CompanyOfHanJun. All rights reserved.
//

#import "HttpRequst.h"

void (^pFunc1) (NSData *data);//方法1:2.在网络类中定义块的指针
void (*pFunc2) (NSData *data);//方法2:3.在网络类中定义函数的指针

@implementation HttpRequst

- (id)init
{
    self = [super init];
    if (self) {
        _receiverData = [[NSMutableData alloc] initWithCapacity:100];
    }
    return self;
}

//方法1:3.网络类收到请求(包含发信息对象的块-函数指针),开始处理
- (void)requestDataFormBlock:(void (^)(NSData * data))getData{
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:30.0];
    [NSURLConnection connectionWithRequest:request delegate:self];
    
    pFunc1 = getData;//方法1:4.让我们自定义的指针指向发过来的函数指针
}

//方法2:4.网络类收到请求(包含发信息对象的函数指针),开始处理
- (void)requestDataFromFunctionPointer:(void (*)(NSData * data))getData{
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:30.0];
    [NSURLConnection connectionWithRequest:request delegate:self];
    
    pFunc2 = getData;//方法2:5.让我们自定义的指针指向发过来的函数指针
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    
    [_receiverData appendData:data];    
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    //(pFunc1)(_receiverData);//方法1:5.网络类处理完成,把请求到的数据发送给函数指针的参数
    (pFunc2)(_receiverData);//方法2:6.网络类处理完成,把请求到的数据发送给函数指针的参数
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    
}


@end

块回调步骤:

1.通过块语法向网络类发送函数指针,请求处理;

2.在网络类中定义块的指针;

3.网络类收到请求(包含发信息对象的块-函数指针),开始处理;

4.让我们自定义的指针指向发过来的函数指针;

5.网络类处理完成,把请求到的数据发送给函数指针的参数;

6.得到发送过来的消息,回调结束!

函数指针回调步骤:

1.pFunc2函数指针指向getData函数;

2.把函数指针传给网络处理类;

3.在网络类中定义函数的指针;

4.网络类收到请求(包含发信息对象的函数指针),开始处理;

5.让我们自定义的指针指向发过来的函数指针;

6.网络类处理完成,把请求到的数据发送给函数指针的参数;

7.网络类调用该方法,并把消息发送过来,回调结束!

致力于ios开发
原文地址:https://www.cnblogs.com/hanjun/p/2961256.html