[IOS新手求助]关于OC的block的使用不太懂 iosblock 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这里的handler 可以理解为c++的函数指针,它指代的是一个函数签名在一个方法中如果要传递一个参数,就需要为这个参数指明类型 。如:-(void)test:(NSString *)test times:(int) times但有时候我们想将一个函数作为函数的参数来传递时怎么办呢,这里就需要用到block了。看一下你上面的handler的定义,就明白怎么使用了///////这里就声明了一个block,这个block的类型completeHandlertypedef void(^completeHandler)(NSData *data); //////这个方法的第二个参数就是将一个函数作为函数的参数来传递,block代表了方法的类型,handler是这个函数的签名+(void)regWithIDFA:(NSString *)idfa completeHandler:(void(^)(NSData *data)) handler;使用handler就是在调用函数,这个函数无返回值,有一个参数为NSData类型。这样应该明白些了吧 别想复杂了,这就是一个block回调而已,不是block内部调用block。regWithIDFA是个类方法,内部是在请求到数据后回调给block #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 handler(data);在这里为什么说数据回调给handler?handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方 handler(data);在这里为什么说数据回调给handler?handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方handler确实是一个block,它是在外部实现的,虽然block的内部实现比较复杂(被编译成OC类),但是你可以像1楼说的那样,想象成一个函数指针,只要它的地址没被释放,回调就是安全的。你的疑问可能在34行的NSURLConnection上,它的确是在block中调用了另一个block,不过这有什么关系呢?对他们来说,block就像是一个方法一样,它们只是在合适的时机调用了这个方法而已 handler(data);在这里为什么说数据回调给handler?handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方这个handler也可以理解为一个函数的占位符,表明这里传递过来的函数,需要我们在外部调用时指定它的函数实现。在这里我们只是以这个函数的签名来出现代表这个函数。 而这个函数返回的是什么类型,以及需要哪些参数呢,那么就是要求我们同时指明它的类型,这个代表函数的类型就需要使用block来定义。这样能明白些了吗? 感谢两位大大的耐心指导,由于初接触IOS开发,果然有点笨啊~是我理解错了实际上就是一个调用block的方法在被调用时实现block十分感谢! 利用SDWebImage 异步加载图片的话,怎么跟踪进度? iphone开发网页 coscos2d-x的一个问题! object-c 数组排序!!!求助!!! 高手在哪里 关于iphone编程的问题 熟悉并且能做iphone项目的朋友请联系我一下 二维码扫描安装是如何实现的 控件重叠 以上普通的json如何以这种方式展示 谁有HBuilder使用TCP的成功例子? 虚拟机安装mac 问题 Linux中的gethostbyname_r函数,对应在iOS中的什么函数?
在一个方法中如果要传递一个参数,就需要为这个参数指明类型 。如:
-(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类型。这样应该明白些了吧
regWithIDFA是个类方法,内部是在请求到数据后回调给block
#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
handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方
handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方
handler确实是一个block,它是在外部实现的,虽然block的内部实现比较复杂(被编译成OC类),但是你可以像1楼说的那样,想象成一个函数指针,只要它的地址没被释放,回调就是安全的。
你的疑问可能在34行的NSURLConnection上,它的确是在block中调用了另一个block,不过这有什么关系呢?对他们来说,block就像是一个方法一样,它们只是在合适的时机调用了这个方法而已
handler不是一个block类似与方法吗?代码我贴出来了,也没有看见handler的实现的地方
这个handler也可以理解为一个函数的占位符,表明这里传递过来的函数,需要我们在外部调用时指定它的函数实现。在这里我们只是以这个函数的签名来出现代表这个函数。 而这个函数返回的是什么类型,以及需要哪些参数呢,那么就是要求我们同时指明它的类型,这个代表函数的类型就需要使用block来定义。这样能明白些了吗?
十分感谢!