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.網絡類調用該方法,並把消息發送過來,回調結束!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM