ios GCD简单介绍 后台运行~

本从实践出发简单说明:

首先,gcd是Grand Central Dispatch的缩写,意为多线程优化技术,是苹果为多核处理优化的技术。使用简单、清晰。

多线程就分同步、异步方法如下:

//异步线程开启:
 dispatch_async(dispatch_queue_t queue, ^(void)block)
//同步线程开启:
 dispatch_sync(dispatch_queue_t queue, ^(void)block)
 //dispatch_queue_t:队列 block:执行内容

队列说明:

创建方法如下:

dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)

参数说明:label为队列名称 attr为队列形式   串行:DISPATCH_QUEUE_SERIAL  并行:DISPATCH_QUEUE_CONCURRENT 

特殊队列说明:

系统默认就有一个串行队列main_queue和并行队列global_queue 使用方法如下:

dispatch_get_main_queue()//主队列
dispatch_get_global_queue(long identifier, unsigned long flags);
/*
identifler:优先级
 *  - DISPATCH_QUEUE_PRIORITY_HIGH:    2    
 *  - DISPATCH_QUEUE_PRIORITY_DEFAULT:      0
 *  - DISPATCH_QUEUE_PRIORITY_LOW:      -2
 *  - DISPATCH_QUEUE_PRIORITY_BACKGROUND: 
flags:待开发属性 请输入0 
*/

最后,特殊线程:

 //前面的线程都结束后执行 此线程结束后才执行它后面的线程
 dispatch_barrier_async(dispatch_queue_t queue, ^(void)block)
 dispatch_barrier_sync(dispatch_queue_t queue, ^(void)block)

//重复执行线程 iterations 次数 
dispatch_apply(size_t iterations, dispatch_queue_t queue, ^(size_t)block)


//只执行一次 单例选择
static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        // code to be executed once  
    }); 

//延迟执行 NSEC_PER_SEC 秒 并非精准执行
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的优先级

void dispatch_set_target_queue( dispatch_object_t object, dispatch_queue_t queue)

 后台运行:

// AppDelegate.h文件
@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;

// AppDelegate.m文件
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self beingBackgroundUpdateTask];
    // 在这里加上你需要长久运行的代码
    [self endBackgroundUpdateTask];
}

- (void)beingBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}
原文地址:https://www.cnblogs.com/chaochaobuhuifei55/p/5546849.html