末尾有demo地址
1.在Controll中加上一个button
1
2
3
4
5
6
7
8
9
10
|
- (
void
)viewDidLoad
{
[super viewDidLoad];
UIButton * tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[tempButton setFrame:CGRectMake(50, 50, 220, 40)];
[tempButton setTitle:@
"ClickME"
forState:UIControlStateNormal];
[tempButton addTarget:self action:@selector(clickButton) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:tempButton];
// Do any additional setup after loading the view, typically from a nib.
}
|
2.点击button,然后开始两个CGD任务。其中一个在A,1s后停止,停止时将任务B也停止。
停止方式,cancel这个方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
- (
void
)clickButton
{
__block UIView * tempView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 220, 30)];
[tempView setBackgroundColor:[UIColor grayColor]];
[self.view addSubview:tempView];
[tempView release];
__block
BOOL
cancel = NO;
//点击之后就会开始执行这个方法
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
int
i = 0;
while
(i < 1000000000 && cancel == NO) {
i++;
}
NSLog(@
"Task end: i = %d"
, i);
//这个不会执行,因为在之前,gcd task已经结束
[tempView removeFromSuperview];
});
//1s 之后执行这个方法
double
delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(
void
){
NSLog(@
"A GCD Task Start"
);
cancel = YES;
[tempView setBackgroundColor:[UIColor blackColor]];
});
}
|
3.运行结果
1
2
|
2013-05-08 19:38:35.730 BlockAsync[1880:11303] A GCD Task Start
2013-05-08 19:38:35.732 BlockAsync[1880:12303] Task end: i = 403577657
|