[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理解后其实没什么,而且很好用。

  

 


posted @ 2013-03-21 02:21  金建彤  阅读(245)  评论(0编辑  收藏  举报