干iOS开发3个月了,Block用到很多,但大多数还是不太理解, 自己分析感觉,Block的写法不习惯,主要还是要多写用,参考网上别人的帖子, 自己尝试谢谢 ,留作备份,方便自己以后查阅
NO.1 (简单理解Block)
ViewController.h
(1)在类中,定义一个Block变量,就像定义一个函数;
(2)Block可以定义在方法内部,也可以定义在方法外部;
(3)只有调用Block时候,才会执行其{}体内的代码;
(PS:关于第(2)条,定义在方法外部的Block,其实就是文件级别的全局变量)
光看这几条 肯定看不懂咯,还是要结合例子看
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
//定义在外部的无参数 无返回 的block
void (^notInside)() = ^(){
NSLog(@"我是定义在外部的block");
};
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//1.定义一个无返回 参数为 int a 的名字为 printF 的 block
void (^printF)(int a) = ^(int a){
NSLog(@"%d",a);
void (^nslog)(float b) = ^(float c){
NSLog(@"%.2f",c);
};
nslog(2.2);
};
printF(9);
printF (123);
//2.定义了一个无返回 无参数的名字为 noback 的 block
void (^noback)() = ^(){
NSLog(@"no back anything");
};
noback();
noback(9);
//3.定义一个返回int 参数int 的名字为 getBack 的block
int (^getBack)(int d) = ^(int c){
NSLog(@"%d",c*1);
return c*1;
};
getBack(100);
//定义在外部的函数
notInside();
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
打印结果
2016-02-26 15:15:01.731 iOS - Block学习[1593:66223] 9
2016-02-26 15:15:01.731 iOS - Block学习[1593:66223] 2.20
2016-02-26 15:15:01.731 iOS - Block学习[1593:66223] 123
2016-02-26 15:15:01.731 iOS - Block学习[1593:66223] 2.20
2016-02-26 15:15:01.732 iOS - Block学习[1593:66223] no back anything
2016-02-26 15:15:01.732 iOS - Block学习[1593:66223] no back anything
2016-02-26 15:15:01.732 iOS - Block学习[1593:66223] 100
2016-02-26 15:15:01.732 iOS - Block学习[1593:66223] 我是定义在外部的block
以上,是写在一个ViewController里面的block , 这样的效果相当于自己为自己写了个代理,然后自己去做这个代理(self.view.delegate = self) ,然后又在ViewController里面自己实现代理的方法( -(void)do something{…….}), 一般来说,这样的block 没什么人用,这里只是做原理解释
NO.2 (__block 是干啥的)
http://my.oschina.net/leejan97/blog/268536
_abcd = @"22";
__block int abcd = 22;
int (^changeABV)(int d) = ^(int c){
abcd = abcd*c;
_abcd = [NSString stringWithFormat:@"%d", [_abcd intValue]*c];
NSLog(@"%d",abcd);
return abcd;
};
__block (int xxx) 能让变量在block()的{}中能被修改
(周五下班 未完待续)
好了 继续回来 今天在写一个方法的时候 就用到了__block的 具体例子
这里, 我需要封装一个AFHttp请求, 为了方便,我打算返回这个请求的结果 (一个NSString)字符串,
无疑这个字符串
NSLog(@"tn ==== %@" , operation.responseString);
是在AFNetworking中的block返回的
这里,我在外部定义一个字符串属性 t
NSString * t =[[NSString alloc] init];
so,问题来了
这里,我们就会用到 __block 来修饰 这个定义好的字符串属性
__block NSString * t =[[NSString alloc] init];
这样,就不会报错, 让字符串属性 t 可以在被修改
这是方法全文:
-(NSString *)getTN{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
__block NSString * t =[[NSString alloc] init];
[manager GET:kURL_TN_Normal parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"tn ==== %@" , operation.responseString);
t = operation.responseString;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
return t;
}
ps: 补充
以上代码 我也弄错了一点
这段代码
-(NSString *)getTN{.....} 这里面我打算return一个NSString,单实际上我发现在AFNetworking的Success代码块里,我获得的数据并不能拿出来 ,因为AFNetworking库里面,是异步线程做的数据获取,
唯一的解决办法就是,使用GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//异步操作
//返回主线程 拿到数据 dispatch(get_main_queue)
});
具体例子看这里, 重新写一个具体代码的,
http://blog.csdn.net/iostiannan/article/details/50781655
至于如何在 dispatch(get_main_queue) {} 里面return数据 ,我还没解决 ,后来的拒绝方式就是 使用代理去完成 数据的传递