十四章--iCloud--之三

这段代码里的“^”千万不要以为是运算符异或,这里是ios4以后引入的新语法,叫Block,实际上我理解就是内联函数,在函数的里面申明函数并执行。类似于回调函数和delegate什么的,使用起来更加方便快捷。

网上的资料是这样说的:

Block是IOS4以后引进的新语法,用来实现匿名函数的特性,有点类似于Java中的匿名内部类但又有一点差别。Apple官方文档对block的解释是:A block is an anonymous inline collection of code, and sometimes also called a "closure".意思就是block是一个匿名的内联代码集合,也被称为“闭包”(closure)。关于闭包可以这么理解:如果一个函数里定义了一个block,那么这个block可以访问这个函数的内部变量。blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似。

block的基本使用

[self.chosenDocument saveToURL:saveUrl

                      forSaveOperation:UIDocumentSaveForCreating
                     completionHandler: ^(BOOL success) {
                         if (success) {
                             NSLog(@"save OK");
                             [self reloadFiles];
                             [self performSegueWithIdentifier:@"masterToDetail"
                                                       sender:self];
                         } else {
                             NSLog(@"failed to save!");
                         }

                     }];

解释下上面的代码:[self.chosenDocument saveToURL 是要存储一个文档,其中completionHandler参数就是一个block,本身需要一个bool值作为这个block的参数,bool值是存储是否成功的返回值,blcck里面如果成功就执行重新读取文件到TableView的列表,然后执行segue到下一个界面。

使用中需要注意的:

如果要在block中修改外部变量sum的值,必须用关键字__block(前面是两条下划线)来修饰,否则会报错。但是在block中可以直接修改static类型的变量。block还可以作为函数的参数,当作为函数参数时,可以取代回调函数或者Delegate,当函数调用时触发了某个事件,则block里面的代码会执行,这样的好处是有利于整合代码和代码阅读,而不用去另外编写回调方法或实现委托方法,提高了代码的整体性和可读性,另外使用block可以直接访问函数中的局部变量也是优点之一,这样省去了在回调或委托方法中还需要另外将局部变量进行传递的麻烦,Cocoa中很多类都支持block方式的调用,以下列出了使用block的一些场景:

任务完成时回调

处理消息监听回调处理

错误回调处理

枚举回调

视图动画、变换

排序

以下是一个用block来遍历集合的例子:

[cpp] view plaincopy
  1. //使用block来遍历集合  
  2.     __block BOOL found = NO;  
  3.     NSArray *array = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];  
  4.     [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {  
  5.         if ([obj localizedCaseInsensitiveCompare:@"two"] == NSOrderedSame) {  
  6.             *stop = YES;  
  7.             found = YES;  
  8.             NSLog(@"Enumerate is done");  
  9.         }  
  10.     }];  

输出结果如下:

2012-08-10 13:16:26.700 ASIHttpRequestTest[6220:f803] Enumerate is done


你可能感兴趣的:(十四章--iCloud--之三)