zoukankan      html  css  js  c++  java
  • [ios]blocks

    来至:http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxUsing.html#//apple_ref/doc/uid/TP40007502-CH5-SW1

    1.block是什么

    int (^oneFrom)(int) = ^(int anInt) {  

        return anInt - 1;  

    };  

       

    printf("1 from 10 is %d", oneFrom(10));

    分析:

    1.int (^oneFrom)(int) =>                1,第一个int为返回类型 2,^为block标志, block变量名为:oneFrom 3,(int)为参数类型

    2.^(int anInt) {  retrun anInt-1;}=>2,参数为anInt的一个block语句,可以说是一个block(我理解为没有名字的方法),把一个blcok赋给了一个变量.

    3.oneFrom(10)                              3,通过变量名可调用block。

    2.将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);  

    }); 

    红色部分为最后一个参数,也就是一个block,也是一个方法..

    很多情下作为回调的一个方法,非常方便.

    在多线程里有这样一个函数

    void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t));

    这个函数的作用为调用iterations次 block方法;

    具体参数:第一个表示执行的迭代次数,第二个参数指定block将要提交的队列,第三个参数是block本身,它带有一个参数(当前迭代的索引)。

      size_t count = 10;  
            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
            
            dispatch_apply(count, queue, ^(size_t i) {  
                printf("i=%lu\n", i);  
                NSLog(@"%@",@"ok");
                
            }); 

     可以变换为:

     void (^doApply)(size_t i)=^(size_t i) {
        printf("i=%lu\n", i); 
      NSLog(@"%@",@"ok");
    };

    size_t count = 10;  
            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
            
            dispatch_apply(count, queue,doApply ); 

    开启的线程为:包括主线程一共6个;

    输出结果为:

    i=1
    i=2
    i=3
    2013-03-21 01:48:35.757 suanfa[1061:1903] ok
    i=4
    2013-03-21 01:48:35.757 suanfa[1061:1803] ok
    i=5
    2013-03-21 01:48:35.757 suanfa[1061:1a03] ok
    i=6
    2013-03-21 01:48:35.757 suanfa[1061:403] ok
    i=7
    2013-03-21 01:48:35.759 suanfa[1061:1903] ok
    i=8
    2013-03-21 01:48:35.760 suanfa[1061:1a03] ok
    i=9
    2013-03-21 01:48:35.760 suanfa[1061:1803] ok
    2013-03-21 01:48:35.760 suanfa[1061:403] ok
    2013-03-21 01:48:35.760 suanfa[1061:1903] ok
    2013-03-21 01:48:35.761 suanfa[1061:1a03] ok

    而且每次输出ok时间段都不一样,可以证明队列是异步执行;

    几个应用例子:

    1.

     

    __block BOOL found = NO;  

    NSSet *aSet = [NSSet setWithObjects: @"Alpha", @"Beta", @"Gamma", @"X", nil];  

    NSString *string = @"gamma";  

       

    [aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {  

        if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) {  

            *stop = YES;  

            found = YES;  

        }  

    }];  

    2.

    NSArray *array = [NSArray arrayWithObjects: @"A", @"B", @"C", @"A", @"B", @"Z",@"G", @"are", @"Q", nil];  

    NSSet *filterSet = [NSSet setWithObjects: @"A", @"Z", @"Q", nil];  

       

    BOOL (^test)(id obj, NSUInteger idx, BOOL *stop);  

       

    test = ^ (id obj, NSUInteger idx, BOOL *stop) {  

       

        if (idx < 5) {  

            if ([filterSet containsObject: obj]) {  

                return YES;  

            }  

        }  

        return NO;  

    };  

       

    NSIndexSet *indexes = [array indexesOfObjectsPassingTest:test];  

       

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

    block理解后其实没什么,而且很好用。

      

     


  • 相关阅读:
    [BZOJ 2820]YY的GCD
    [POI 2007]ZAP-Queries
    [USACO 04OPEN]MooFest
    [HAOI 2011]Problem b
    [COGS 2258][HZOI 2015]复仇的序幕曲
    [UOJ 41]【清华集训2014】矩阵变换
    [POJ 3487]The Stable Marriage Problem
    [POJ 3252]Round Numbers
    [COGS 1799][国家集训队2012]tree(伍一鸣)
    [SDOI 2011]计算器
  • 原文地址:https://www.cnblogs.com/jinjiantong/p/2972451.html
Copyright © 2011-2022 走看看