iOS开发多线程篇—GCD的常见用法

iOS开发多线程篇—GCD的常见用法(简单介绍):

复制代码
 //  后台执行:
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // something
 });

 // 主线程执行:
 dispatch_async(dispatch_get_main_queue(), ^{
      // something
 });

 // 一次性执行:
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     // code to be executed once
 });

 // 延迟2秒执行:
 double delayInSeconds = 2.0;
 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     // code to be executed on the main queue after delay
 });

 // 自定义dispatch_queue_t
 dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
 dispatch_async(urls_queue, ^{  
   // your code 
 });
 dispatch_release(urls_queue);

 // 合并汇总结果
 dispatch_group_t group = dispatch_group_create();
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行执行的线程一
 });
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行执行的线程二
 });
 dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
      // 汇总结果
 });
复制代码

一个应用GCD的例子:

复制代码
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
        NSError * error;
        NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
        if (data != nil) {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"call back, the data is: %@", data);
            });
        } else {
            NSLog(@"error when download:%@", error);
        }
    });

iOS开发多线程篇—GCD的常见用法(详细介绍)

一、延迟执行 1.介绍 iOS常见的延时执行有2种方式

(1)调用NSObject的方法

[self performSelector:@selector(run) withObject:nil afterDelay:2.0];

// 2秒后再调用self的run方法

(2)使用GCD函数

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    // 2秒后异步执行这里的代码...

});

2.说明

第一种方法,该方法在那个线程调用,那么run就在哪个线程执行(当前线程),通常是主线程。

[self performSelector:@selector(run) withObject:nil afterDelay:3.0];

说明:在3秒钟之后,执行run函数

代码示例:

01. 1 //
02. 2 //  YYViewController.m
03. 3 //  01-GCD的常见使用(延迟执行)
04. 4 //
05. 5 //  Created by apple on 14-6-25.
06. 6 //  Copyright (c) 2014年 itcase. All rights reserved.
07. 7 //
08. 8
09. 9 #import "YYViewController.h"
10. 10
11. 11 @interface YYViewController ()
12. 12
13. 13 @end
14. 14
15. 15 @implementation YYViewController
16. 16
17. 17 - (void)viewDidLoad
18. 18 {
19. 19     [super viewDidLoad];
20. 20     NSLog(@"打印线程----%@",[NSThread currentThread]);
21. 21     //延迟执行
22. 22     //第一种方法:延迟3秒钟调用run函数
23. 23     [self performSelector:@selector(run) withObject:nil afterDelay:2.0];
24. 24    
25. 25 }
26. 26 -(void)run
27. 27 {
28. 28     NSLog(@"延迟执行----%@",[NSThread currentThread]);
29. 29 }
30. 30
31. 31 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
32. 32 {
33. 33     //在异步函数中执行
34. 34     dispatch_queue_t queue = dispatch_queue_create("wendingding"0);
35. 35    
36. 36     dispatch_sync(queue, ^{
37. 37         [self performSelector:@selector(test) withObject:nil afterDelay:1.0];
38. 38     });
39. 39     NSLog(@"异步函数");
40. 40 }
41. 41 -(void)test
42. 42 {
43. 43     NSLog(@"异步函数中延迟执行----%@",[NSThread currentThread]);
44. 44 }
45. 45 @end

说明:如果把该方法放在异步函数中执行,则方法不会被调用(BUG?)

加载中...  第二种方法,

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

       //延迟执行的方法

    });

说明:在5秒钟之后,执行block中的代码段。

参数说明:

加载中...

什么时间,执行这个队列中的这个任务。

代码示例:

01. 1 //
02. 2 //  YYViewController.m
03. 3 //  02-GCD常见使用(延迟执行2)
04. 4 //
05. 5 //  Created by apple on 14-6-25.
06. 6 //  Copyright (c) 2014年 itcase. All rights reserved.
07. 7 //
08. 8
09. 9 #import "YYViewController.h"
10. 10
11. 11 @interface YYViewController ()
12. 12
13. 13 @end
14. 14
15. 15 @implementation YYViewController
16. 16
17. 17 - (void)viewDidLoad
18. 18 {
19. 19     [super viewDidLoad];
20. 20
21. 21     NSLog(@"打印当前线程---%@",  [NSThread currentThread]);
22. 22    
23. 23     //延迟执行,第二种方式
24. 24      //可以安排其线程(1),主队列
25. 25      dispatch_queue_t queue= dispatch_get_main_queue();
26. 26     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), queue, ^{
27. 27         NSLog(@"主队列--延迟执行------%@",[NSThread currentThread]);
28. 28     });
29. 29    
30. 30     //可以安排其线程(2),并发队列
31. 31     //1.获取全局并发队列
32. 32     dispatch_queue_t queue1= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
33. 33     //2.计算任务执行的时间
34. 34     dispatch_time_t when=dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
35. 35     //3.会在when这个时间点,执行queue中的这个任务
36. 36     dispatch_after(when, queue1, ^{
37. 37         NSLog(@"并发队列-延迟执行------%@",[NSThread currentThread]);
38. 38     });
39. 39 }
40. 40
41. 41 @end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值