以下摘抄来自百度百科
1
|
dispatch_queue_t myQueue = dispatch_queue_create(
"com.iphonedevblog.post"
, NULL);
|
1
|
dispatch_async(myQueue, ^{ [self doSomething]; });
|
1
2
3
|
dispatch_async(dispatch_queue_create (
"com.iphonedevblog.post"
, NULL), ^{
[self doSomething]; }
);
|
1
|
dispatch_suspend(myQueue);
//恢复一个队列
|
1
|
dispatch_resume(myQueue);
|
1
2
3
|
/*dispatch_sync(dispatch_get_main_queue(), ^{
[self dismissLoginWindow]; }
);*/
在主线程中使用会造成死锁,慎用!
|
1
2
3
4
5
6
|
-(IBAction)analyzeDocument:(NSButton*)sender{
NSDictionary*stats=[myDoc analyze];
[myModel setDict:stats];
[myStatsViewsetNeedsDisplay:YES];
[stats release];
}
|
1
2
3
4
5
6
7
8
9
|
-(IBAction)analyzeDocument:(NSButton*)sender{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
NSDictionary*stats=[myDoc analyze];
dispatch_async(dispatch_get_main_queue(),^{
[myModel setDict:stats];
[myStatsView setNeedsDisplay:YES];
[stats release];});
});
};
|
1
2
3
4
|
for
(i=0;i<count;i++){
results[i]=do_work(data,i);
}
total=summarize(results,count);
|
1
2
3
4
|
dispatch_apply(count,dispatch_get_global_queue(0,0),^(size_ti){
results[i]=do_work(data,i);
});
total=summarize(results,count);
|
1
2
3
4
5
|
dispatch_queue_t exampleQueue;
exampleQueue=dispatch_queue_create(
"com.example.unique.identifier"
,NULL);
//exampleQueue may be used here.
dispatch_release(exampleQueue);
|
1
2
3
4
5
6
7
8
9
|
dispatch_queue_t exampleQueue=dispatch_queue_create(
"com.example.unique.identifier"
,NULL);
dispatch_sync(exampleQueue,^{
dispatch_sync(exampleQueue,^{
printf
(
"I am now deadlocked...\n"
);
});
});
dispatch_release(exampleQueue);
|
下面来点代码:
@implementation ViewController //同步 和 异步区别:当前代码是否等待block执行完毕再往下执行,同步就等待,异步不等待 //串行 和 并行队列区别:串行,block按顺序执行;并行,block可以同时执行 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerHandle) userInfo:nil repeats:YES]; } - (void)timerHandle { dispatch_async(_queue, ^{ NSLog(@"代码执行了"); }); } //界面消失时销毁计时器,以防内存泄漏 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [_timer invalidate]; } - (void)viewDidLoad { [super viewDidLoad]; //isMainThread 判断当前线程是否为主线程 if ([NSThread isMainThread]) { NSLog(@"主线程"); } else { NSLog(@"分线程"); } //performSelectorOnMainThread 在主线程中执行方法 //[self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>] _queue = dispatch_queue_create("ming", NULL); } //串行队列 - (IBAction)serialQueueClick:(UIButton *)sender { //GCD,grand central dispatch,调度中心。用于控制多线程调度 //dispatch_queue_t 线程队列 //dispatch_queue_create 创建一个线程队列,第一个参数:队列名字;第二个参数:要创建的队列类型。 //线程队列分为两种:1、串行队列; 2、并行队列 //DISPATCH_QUEUE_SERIAL 或 NULL 表示串行队列 //DISPATCH_QUEUE_CONCURRENT 并行队列,但是并行队列一般不创建,用系统自带的。 dispatch_queue_t queue = dispatch_queue_create("明哥", DISPATCH_QUEUE_SERIAL); //对于串行队列,队列中的block会按照进入队列中的顺序在同一个分线程中一个一个执行。 //dispatch_async 在一个队列中异步执行一个block,把block放入队列后当前代码立刻往下执行 //dispatch_sync 在一个队列中同步执行一个block,把block放入队列后等待block执行完当前代码再往下走。 dispatch_async(queue,^{ //sleepForTimeInterval 让线程休眠 [NSThread sleepForTimeInterval:1]; //currentThread 获得当前线程 [NSThread currentThread]; NSLog(@"1"); NSLog(@"%@",[NSThread currentThread]); }); dispatch_async(queue,^{ [NSThread sleepForTimeInterval:1]; NSLog(@"2"); NSLog(@"%@",[NSThread currentThread]); }); //非ARC下,线程队列如果是自己创建的,那么用完之后,需要release //dispatch_release(queue); } //并行队列 - (IBAction)concurrentQueueClick:(UIButton *)sender { //并行队列使用时一般不需要创建,直接找到系统的 global_queue //dispatch_get_global_queue 函数,获得系统并行队列,第一个参数:获得的队列的优先级,第二个参数:预留参数 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //对于并行队列,在没有达到最大并发数之前,放入队列中的所有block会立刻放入一个线程中执行 dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"11"); NSLog(@"%@",[NSThread currentThread]); }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"22"); NSLog(@"%@",[NSThread currentThread]); }); } //主线程队列 - (IBAction)mainQueueClick:(UIButton *)sender { //dispatch_get_main_queue() ,主线程队列(是一个串行队列),不能创建,只能通过函数得到 //dispatch_queue_t queue = dispatch_get_main_queue(); //在分线程中调用主线程 dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1-%d",[NSThread isMainThread]); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"2-%d",[NSThread isMainThread]); }); }); } //暂停队列 - (IBAction)suspendQueueClick:(UIButton *)sender { //dispatch_suspend 暂停一个队列 //暂停一个队列,对于队列中正在执行的block不会暂停,对于等待中的block不会再进入执行。一个暂停的队列还可以继续加入block dispatch_suspend(_queue); } //继续队列 - (IBAction)resumeQueueClick:(UIButton *)sender { //dispatch_resume 继续一个队列 dispatch_resume(_queue); }