您的位置:首页 > 移动开发 > IOS开发

iOS 多线程 GCD(滚床单) 的高级用法

2016-03-15 01:21 651 查看

GCD 的四种高级用法:

以下是我总结的四种 滚床单 的高级用法

及示例程序 和 输出结果.

#pragma mark - 1.0 一次性执行 : 代码只执行一次

#pragma mark - 2.0
单设计模式 : 创建单例

#pragma mark - 3.0
延时执行方法 : 延时执行任务

#pragma mark - 4.0
调度组 : 监听是否一组任务执行完成

#import "ViewController.h"

#import "userManager.h"

@interface
ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}

- (IBAction)btn1:(UIButton *)sender {

    [self onceDemo];

}

- (IBAction)btn2:(UIButton *)sender {

    [selfshareDemo];

}

- (IBAction)btn3:(UIButton *)sender {

    [selfdelayDemo];

}

- (IBAction)btn4:(UIButton *)sender {

    [selfgroupDemo1];

}

- (IBAction)btn5:(UIButton *)sender {

    [selfgroupDemo2];

}

#pragma mark - 1.0
一次性执行

/*!

 一次性执行 onceToken默认值是0;
当不是0时,不再执行任务

 */

- (void)onceDemo{

    

    NSLog(@"begin!");

    

    static dispatch_once_t onceToken;

    

    NSLog(@"%tu",onceToken);

    

    dispatch_once(&onceToken, ^{

        NSLog(@"helloWorld %@",[NSThreadcurrentThread]);

    });

}



#pragma mark - 2.0
单设计模式

/*

 单例:

 1. 只有一个单例对象

 2. 有一个全局的实例化方法

 3. 它的生命周期和
应用程序一样长

 4. 它在静态区

 */

/**

 *  通过一次性执行创建单例创建单例类,创建获取单例方法和单例管理的方法

 */

- (void)shareDemo{

    

    userManager * ins = [userManagersharedManger];

    

    [ins userName];

}

#pragma mark - 3.0
延时执行方法

/**

 *  延迟执行 Demo

 */

- (void)delayDemo{

    

    NSLog(@"开始计时!");

    

    //
过了两秒执行

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

        NSLog(@"两秒后: %@",[NSThreadcurrentThread]);

        

        

        //
再过两秒执行

        dispatch_time_t when =dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(2.0 *
NSEC_PER_SEC));

        dispatch_queue_t queue =dispatch_get_main_queue();

        dispatch_block_t block = ^{

            NSLog(@"又过了两秒两秒后: %@",[NSThreadcurrentThread]);

        };

       
// 这个函数的参数:
延迟几秒在哪个队列
执行什么

        dispatch_after(when, queue, block);

    });

}



#pragma mark - 4.0
调度组

/**

 *  调度组1

 */

- (void)groupDemo1{

    

    dispatch_group_t group =dispatch_group_create();

    

    dispatch_queue_t queue =dispatch_get_global_queue(0,0);

    

    dispatch_group_async(group, queue, ^{

        NSLog(@"下载任务1 %@",[NSThreadcurrentThread]);

    });

    dispatch_group_async(group, queue, ^{

        NSLog(@"下载任务2 %@",[NSThreadcurrentThread]);

    });

    dispatch_group_async(group, queue, ^{

        NSLog(@"下载任务3 %@",[NSThreadcurrentThread]);

    });

    

   
// 监听这一组异步任务是否执行结束,即使没结束也可以执行 OtherCode

    dispatch_group_notify(group,dispatch_get_main_queue(), ^{

        NSLog(@"下载完成 %@",[NSThreadcurrentThread]);

    });

    

    NSLog(@"OtherCode");

}



#pragma mark - 5.0
调度组

/**

 *  调度组2

 */

- (void)groupDemo2{

    

    dispatch_group_t group =dispatch_group_create();

    

    dispatch_queue_t queue =dispatch_get_global_queue(0,0);

    

    dispatch_group_async(group, queue, ^{

        NSLog(@"下载任务1 %@",[NSThreadcurrentThread]);

    });

    dispatch_group_async(group, queue, ^{

        NSLog(@"下载任务2 %@",[NSThreadcurrentThread]);

    });

    dispatch_group_async(group, queue, ^{

        NSLog(@"下载任务3 %@",[NSThreadcurrentThread]);

    });

    

   
// 监听这一组异步任务是否执行结束,没结束就不可以可以执行 OtherCode

    dispatch_group_wait(group,DISPATCH_TIME_FOREVER);

    NSLog(@"下载完成 %@",[NSThreadcurrentThread]);

    

    NSLog(@"OtherCode");

}



- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 多线程 gcd 滚床单