GCD的简单用法

@interface ViewController : UIViewController

@property (nonatomic,strong)void (^loggerBlock)(void);


@end


- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
//    GCD极大的方便了多线程编程,应该尽可能使用GCD来处理后台线程和UI线程的交互

//    block的定义  调用
    [self block];
    
//    修改block以外的变量
    [self ModifyBlock];

//    系统提供的dispatch方法
    [self dispatch];
    
//    自定义queue,用dispatch_queue_create
    [self configQueue];

//    高级用法 两个线程后台并行运行,等到两个线程都结束后,在汇总执行结果
    [self advancedDispatch];

//延长应用在后台运行事件,在Appdelegate设置

}

-(void)block
{

    _loggerBlock = ^{
        NSLog(@"HelloWorld");
    };
    //延时操做
    dispatch_time_t deleyTime = dispatch_time(DISPATCH_TIME_NOW, 5.0 *NSEC_PER_SEC);
    dispatch_after(deleyTime, dispatch_get_main_queue(), ^{
        NSLog(@"延时调用");
//        调用
        _loggerBlock();
        
    });
}

-(void)ModifyBlock
{
    __block int a = 0;
    void (^foo)(void) =^{
        a = 1;
        NSLog(@"%d",a);
    };
    foo();
    


}

-(void)dispatch
{
//后台执行:
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //something
    });

//主线程执行
    dispatch_async(dispatch_get_main_queue(), ^{
        //something
    });
    
//    一次性执行  通常用在单例线程安全模式
    static dispatch_once_t onceTaken;
    dispatch_once(&onceTaken,^{
    //Tools *t = [Tools alloc]init];
    });
    
//    延迟执行
    double delayInTime = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInTime * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        //在主线程延迟执行的事件
    });
    
}

-(void)configQueue
{
    dispatch_queue_t urls_queue = dispatch_queue_create("http://my.oschina.net/u/2319073/admin/new-blog", NULL);
    dispatch_async(urls_queue, ^{
//        your coder
    });
//    dispatch_release(urls_queue);
}

-(void)advancedDispatch
{
    //分段下载进度条
    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), ^{
       //汇总结果
    });
}

//
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic,strong)void (^loggerBlock)(void);
@end

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self beingBackgroundUpdateTask];
//    须要长久运行的代码
    [self endBackgroundUpdateTask];
    
}
#pragma 延长后台运行时间
-(void)beingBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
    
}

-(void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}
相关文章
相关标签/搜索