解决方案 »

  1.   

    这里的handler 可以理解为c++的函数指针,它指代的是一个函数签名
    在一个方法中如果要传递一个参数,就需要为这个参数指明类型 。如:
    -(void)test:(NSString *)test times:(int) times
    但有时候我们想将一个函数作为函数的参数来传递时怎么办呢,这里就需要用到block了。
    看一下你上面的handler的定义,就明白怎么使用了///////这里就声明了一个block,这个block的类型completeHandler
    typedef void(^completeHandler)(NSData *data);  //////这个方法的第二个参数就是将一个函数作为函数的参数来传递,block代表了方法的类型,handler是这个函数的签名
    +(void)regWithIDFA:(NSString *)idfa completeHandler:(void(^)(NSData *data)) handler;
    使用
    handler就是在调用函数,这个函数无返回值,有一个参数为NSData类型。这样应该明白些了吧
      

  2.   

    别想复杂了,这就是一个block回调而已,不是block内部调用block。
    regWithIDFA是个类方法,内部是在请求到数据后回调给block
      

  3.   

    #import "Net.h"
    #import <UIKit/UIKit.h>
    #import"Tools.h"@implementation Net+(void)loadData:(NSString *)url agrs:(NSDictionary *)dict completeHandler:(void (^)(NSData *))handler{
        
        NSMutableURLRequest * req = [[NSMutableURLRequest alloc]initWithURL:[[NSURL alloc]initWithString:url]];
        req.HTTPMethod = @"POST";
        
        NSMutableString * body = [[NSMutableString alloc]init];
        
        for(NSString * key in[dict keyEnumerator]){
            [body appendFormat:@"%@=%@&",key,[dict valueForKey:key]];
        }
        
        [body appendFormat:@"api_key=%@",API_KEY];
        [body appendFormat:@"api_secret=%@",API_SECRET];
        
        
        int nonce = rand();
        long timestamp = time(nil);
        
        [body appendFormat:@"nonce=%d",nonce];
        [body appendFormat:@"timestamp=%ld",timestamp];
        
        NSString * api_sig = [Tools md5:[NSString stringWithFormat:@"%d%ld%@%@",nonce,timestamp,API_KEY,API_SECRET]];
        
        [body appendFormat:@"api_sig=%@",api_sig];
        
        req.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
        
        [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError){
            if(data){
                handler(data);
            }else{
                [[[UIAlertView alloc] initWithTitle:@"提醒" message:@"加载数据失败,请稍后重试" delegate:nil cancelButtonTitle:@"好的" otherButtonTitles:nil, nil]show];
            }
        }];
        
    }
    @end
      

  4.   

    handler(data);在这里为什么说数据回调给handler?
    handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方
      

  5.   

    handler(data);在这里为什么说数据回调给handler?
    handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方
    handler确实是一个block,它是在外部实现的,虽然block的内部实现比较复杂(被编译成OC类),但是你可以像1楼说的那样,想象成一个函数指针,只要它的地址没被释放,回调就是安全的。
    你的疑问可能在34行的NSURLConnection上,它的确是在block中调用了另一个block,不过这有什么关系呢?对他们来说,block就像是一个方法一样,它们只是在合适的时机调用了这个方法而已
      

  6.   

    handler(data);在这里为什么说数据回调给handler?
    handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方
    这个handler也可以理解为一个函数的占位符,表明这里传递过来的函数,需要我们在外部调用时指定它的函数实现。在这里我们只是以这个函数的签名来出现代表这个函数。 而这个函数返回的是什么类型,以及需要哪些参数呢,那么就是要求我们同时指明它的类型,这个代表函数的类型就需要使用block来定义。这样能明白些了吗?
      

  7.   

    感谢两位大大的耐心指导,由于初接触IOS开发,果然有点笨啊~是我理解错了实际上就是一个调用block的方法在被调用时实现block
    十分感谢!