iOS块-block和closures

这遍文章是我对块的理解!

1块:

       块是cocoa应用开发强大的c语言特性。和swift的闭包closure,其他语言的lambdas类似。(匿名函数呗。。特么可以当作变量理解。)快是很容易使用的语法之一。块也是一个对象,类似数组和字典,可被继承。既然是对象,那么必定也有它对应的方法和值属性。即可保存值,也可返回值(特么类似于属性的read和write么?)。用于面试时候的定义:Blocks are objects that encapsulate a unit of work -or,in less abstract terms, a segment code - that can be executed at any time.(块是封装一组代码的对象,可以在任何时间被执行)。

     块牛逼的特性就是可以作为方法参数或者函数本身传递,当然也可以作为一个东东(块本来就是对象嘛!)返回来;其他语言中函数也是个变量,这么说你是不是瞬间就懂了!!!

func add(a:Int,_b:Int) ->Int{

return  a + b }

var function: (Int,Int) ->Int = add

------------------------------------------------------

块用在属性里面

@property(nonatomic, copy) void(^myBlock)();//无参无返回值

@property(nonatomic, copy) void(^myBlock1)(NSString*);//nsstring 类型参数

@property(nonatomic, copy) NSString*(^myBlock2)(NSString*);//中间是名字

@property(nonatomic, copy) myBlock testBlock;//和人家申明bool类型的东西没区别,对吧。

//第三个好理解,定义函数的不是这样么:- (void)test{},- (NSString *)testa{},对吧。

块赋值

myBlock testBlock = ^void(){};//对比 Bool stop = YES;   NSArray *arr = @[]; NSString *str = @"";

块使用:

一般在项目中是 A要把值传给B,则A申明块,并填值:

@property(nonatomic,strong) void(^blockName)(someObject *); //现在也可以加上nonull

在事件中触发

//使用前先判断哈,要不然null满天飞。

if(self.blockName) {

self.blockName(someObject); 

 }//在实际中不仅仅只有这些。

比如:afnetworking中的桥段

if(success) {

dispatch_group_async(self.completionGroup?:http_request_operation_completion_group(),self.completionQueue?:dispatch_get_main_queue(), ^{

success(self, responseObject);

});

//----------------------------------------------

B取值。。。。。。。。。。。

A.blockName = ^(someObject *obj){

//这里的obj是传过来的东西。

}

。在项目中海油这样的

[manager  GET: str  parameters:dic success:^(AFHTTPRequestOperation*operation,ONOXMLDocument*responseDocument) {

NSData*data = [responseDocument.rootElement.stringValuedataUsingEncoding:NSUTF8StringEncoding];

NSError*error =nil;

idjsonObject = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];

if([jsonObjectisKindOfClass:[NSDictionaryclass]]){

NSMutableArray*sca = (NSMutableArray*)jsonObject[@"Table"];

self.bigArray= [scacopy];

[self.tableViewreloadData];

}else{

NSLog(@"An error happened while deserializing the JSON data.");

};

}failure:nil];

这段代码是在B中的,B中的manager之行他的某个函数,产生了你需要的东西,然后通过块传回来(回调)给你。一切请求事务放在A中去做。

块改变块外值的问题:

由于块中直接取外面的值都是copy方式,要想改变块外的值需要把块外变量加__block.

块类型的问题:

块中引用值的类型决定块的类型。比如引用了static类型的数据就是全局类型的块。

2:闭包closure ,最简单的一种是这样的:

myClosure = {$0 - $1}

函数是这样的

func addsss(a:Int)->Int {}

闭包这样  (a:Int)->Int

然后这样用 (a:Int)->Int = {(a:Int)in

//a.....

} 

你可能感兴趣的:(iOS块-block和closures)