现在的位置: 首页 > 综合 > 正文

ios开发之 开始使用blocks

2019年10月01日 ⁄ 综合 ⁄ 共 2776字 ⁄ 字号 评论关闭

初探Blocks:Getting
Started with Blocks

翻译不不到位之处,请指正,建议点击上面链接看苹果官网介绍。

下面的部分将以具体的实例帮助你开始使用Blocks

1. 申明和使用Blocks

使用 ^ 操作符声明一个block变量并且指示block的开始,block的函数体包含在一对 {} 中,如下面的例子所示,同C语言一样,最后的 ; 指示声明的结束。

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};


下图解释了上面的例子:


注意:block可以利用在定义它所处的作用域内的变量。

如果你声明了一个block,你可以像一个函数一样使用它。

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};
 
printf("%d", myBlock(3));
// prints "21"


2. 直接使用Block

在许多场合,你不需要声明一个block变量,而是只需要写一个内联的block作为参数传递。下面的例子是一个 qsort_b 的函数,它同标准的 qsort_r 函数相同,但是它使用的是 block 变量作为它的最后一个参数。

char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
 
qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
    char *left = *(char **)l;
    char *right = *(char **)r;
    return strncmp(left, right, 1);
});
 
// myCharacters is now { "Charles Condomine", "George", "TomJohn" }


3. Blocks和Cocoa

Cocoa Frameworks中的许多函数把block作为参数,典型的作用是,对一些对象的集合进行操作,或者当某个操作完成后作为回调处理,下面的例子展示了怎样在NSArray的函数 sortedArrayUsingComparator: 中使用block。该函数只使用了block一个变量,这个例子中block定义为NSComparator的本地变量。

NSArray *stringsArray = [NSArray arrayWithObjects:
@"string 1",
@"String 21",
@"string 12",
@"String 11",
@"String 02", nil];

static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];

NSComparator finderSortBlock = ^(id string1, id string2) {

NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
};

NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
NSLog(@"finderSortArray: %@", finderSortArray);

/*
Output:
finderSortArray: (
"string 1",
"String 02",
"String 11",
"string 12",
"String 21"
)
*/


4. __block变量

block的一个强大的特征是它能够改变同一词法作用域内的变量,使用 __block类型修饰符来标识block能够修改的变量。采用上面"Block 和 Cocoa"的例子,如下例所示,你可以使用block变量来记录字符串相同的个数,为了方便展示,下例直接使用了block并且将 currentLocal 作为block中的一个只读变量。这在Blocks和Variables一节有更详细的讨论。

NSArray *stringsArray = [NSArray arrayWithObjects:
                         @"string 1",
                         @"String 21", // <-
                         @"string 12",
                         @"String 11",
                         @"Strîng 21", // <-
                         @"Striñg 21", // <-
                         @"String 02", nil];
 
NSLocale *currentLocale = [NSLocale currentLocale];
__block NSUInteger orderedSameCount = 0;
 
NSArray *diacriticInsensitiveSortArray = [stringsArray sortedArrayUsingComparator:^(id string1, id string2) {
 
    NSRange string1Range = NSMakeRange(0, [string1 length]);
    NSComparisonResult comparisonResult = [string1 compare:string2 options:NSDiacriticInsensitiveSearch range:string1Range locale:currentLocale];
 
    if (comparisonResult == NSOrderedSame) {
        orderedSameCount++;
    }
    return comparisonResult;
}];
 
NSLog(@"diacriticInsensitiveSortArray: %@", diacriticInsensitiveSortArray);
NSLog(@"orderedSameCount: %d", orderedSameCount);
 
/*
Output:
 
diacriticInsensitiveSortArray: (
    "String 02",
    "string 1",
    "String 11",
    "string 12",
    "String 21",
    "Str\U00eeng 21",
    "Stri\U00f1g 21"
)
orderedSameCount: 2
*/

最后,欢迎大家远离我的微博:http://weibo.com/caryaliu


抱歉!评论已关闭.