block的介绍

时间:2025-01-30 07:03:01

1.2直接使用Block

在很多情况下,你不需要声明一个 block 变量;相反你可以简单的写一个内联(inline)的block 文本,它需要作为一个参数使用。以下的代码使用qsort_b 函数。qsort_b和标准 qsort_r函数类似,但是它使用 block作为最后一个参数。

    char *myCharacters[3] = {"TomJohn", "George","Charles Condomine" };

    

    

    qsort_b(myCharacters,3, sizeof(char *), ^(constvoid *l, constvoid *r) {

        

        char *left = *(char **)l;

        

        char *right = *(char **)r;

        

        returnstrncmp(left, right, 1);

        

    });

    

    // myCharacters is now { "Charles Condomine", "George", "TomJohn" }

    


1.3 CocoaBlocks

Cocoa frameworks里面有部分方法使用 block作为参数,通常不是执行一个对象的集合操作,就是在操作完成的时候作为回调使用。下面的例子显示了如何通过NSArray的方法 sortedArrayUsingComparator:使用block。该方法使用一个参数,即block。为了举例说明,该情况下block 被定义为NSComparator 的局部变量:

    NSArray *stringsArray = [NSArrayarrayWithObjects:

                             

                             @"string 1",

                             

                             @"String 21",

                             

                             @"string 12",

                             

                             @"String 11",

                             

                             @"String 02",nil];

    

    staticNSStringCompareOptions comparisonOptions =NSCaseInsensitiveSearch |NSNumericSearch |

    

    

    NSWidthInsensitiveSearch |NSForcedOrderingSearch;

    

    

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

        

        

        NSRange string1Range =NSMakeRange(0, [string1length]);

        

        return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];

        

        

    };

    

    

    NSArray *finderSortArray = [stringsArraysortedArrayUsingComparator:finderSortBlock];

    

    NSLog(@"finderSortArray: %@", finderSortArray);

    

    

    /*

     

     Output:

     

     finderSortArray: (

     

     "string 1",

     

     "String 02",

     

     "String 11",

     

     "string 12",

     

     "String 21"

     

     )*/