• 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开发
  • 相关阅读:
    【小强升职记】读书笔记
    MySQL HA 方案 MMM、MHA、MGR、PXC 对比
    【新机必备】
    【LeetCode】剑指 Offer 03. 数组中重复的数字
    生成表索引的创建和删除语句
    iptables 屏蔽端口
    mysql-5.6.20主从同步错误之Error_code: 1062 Duplicate entry '1' for key 'PRIMARY', Error_code: 1062
    OpenFeign和Consul爱恨交织的两天
    Docker:Linux离线安装docker-compose
    MySql:mysql命令行导入导出sql文件
  • 原文地址:https://www.cnblogs.com/hanjun/p/2961256.html
Copyright © 2020-2023  润新知