Gavin.han

致力于移动开发 技术改变生活
随笔 - 133, 文章 - 0, 评论 - 46, 阅读 - 42万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

Posted on   gavin.han  阅读(5276)  评论(0编辑  收藏  举报

代码实现:

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.网络类调用该方法,并把消息发送过来,回调结束!

 

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示