[ios]blocks
来源:互联网 发布:电子商务软件 编辑:程序博客网 时间:2024/04/30 15:53
来至: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理解后其实没什么,而且很好用。
- IOS Blocks
- [ios]blocks
- ios学习--blocks programming
- IOS开发 Blocks详解
- iOS Blocks简介
- IOS Blocks示例
- IOS Blocks 详细介绍
- IOS开发 Blocks详解
- iOS之blocks操作
- iOS 关于Blocks
- iOS闭包blocks
- iOS-ARC-Blocks-GCD
- ios里面的blocks学习
- iOS中Blocks的介绍
- iOS中Blocks的介绍
- iOS Blocks 编程(一)
- iOS Blocks 编程(二)
- Blocks基础 Using Blocks in iOS 4: The Basics
- [算法]插入排序
- [算法] 基数排序
- [c]strcpy函数原型
- [ios]给UIView 加圆角,加阴影
- [ios]ios开发之检测UIScrollView的滚动方向 【转】
- [ios]blocks
- [ios] 数据持久化(加密等)
- [ios] UITableVIew单选效果
- [ios]UITableViewCell自适应高度 【转】
- [ios] 函数与字符串的相互转化,@selecte函数转化为字符串传递,字符串转化为@select接收 【转】
- [ios]延迟执行方法,取消执行方法
- [c]指针 【转】
- [oc] IOS atomic与nonatomic,assign,copy与retain的定义和区别 【转】
- [ios]gdb命令【转】