这遍文章是我对块的理解!
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.....
}