iOS GCD学习

GCD概念:Grand Central Dispatch

1.queue 队列 dispatch queue 分发队列

2.task  任务

3.thread 线程

task 是一个一个单独的任务(方法,函数,block)

queue里存放的是一个或者多个task

thread 为了保证task能顺利执行,queue会开辟适当的thread,在开辟的thread里面执行task

queue分两种:

1.serialqueue(串行队列)

特点:任务先进先出.排在前面任务先执行,执行之后后面的任务才开始执行

2.concurrentQueue(并行队列)

特点:任务先进先出,排在前面的任务先执行,一旦开始,后面的任务就开始执行(无需等待一个任务的结束)

把任务放到什么样的队列里,任务就遵循这个队列的规则

//serialqueue

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

//如果要让任务串行,使用serialqueue

//method1:系统serialqueue(mainqueue单例)

//mainqueue只会为任务(无论多少个任务)开辟一个线程,而且这个线程是主线程

//?? 这些任务在 主线程中执行,不是会卡死主线程吗?为什么系统还提供mainqueue?

//主线程最大的作用是刷新ui,做线程间的通信

//    dispatch_queue_t queue = dispatch_get_main_queue();

//添加一个任务

//    dispatch_async(queue, ^{

//        NSLog(@"任务1是否为主线程:%d,%@",[NSThread isMainThread],[NSThread currentThread]); // 1

//    });

//method2:创建一个serialqueue //解决了串行问题和同步的问题

//自己创建的serialQueue也只为任务(不论有几个)创建一个线程,这个线程是子线程,既不会卡死主线程,也实现线程同步

dispatch_queue_t  queue = dispatch_queue_create("createa.SerialQueue", DISPATCH_QUEUE_SERIAL);

dispatch_async(queue, ^{

NSLog(@"任务1是否为主线程:%d,%@",[NSThread isMainThread],[NSThread currentThread]); // 0

});

//凡是使用create的对象都必须释放

dispatch_release(queue);}

//concurrentQueue

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

//如果要并发执行任务,使用concurrentQueue

//method1:系统的globalQueue(单例)  使用系统的就够了

//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//    dispatch_async(queue, ^{

//        NSLog(@"任务1是否为主线程:%d,%@",[NSThread isMainThread],[NSThread currentThread]); // 0

//

//        //如果需要刷新界面 dispatch_get_main_queue一般是再刷新界面时使用

//        dispatch_queue_t mainQueue = dispatch_get_main_queue();

//        dispatch_async(mainQueue, ^{

//            NSLog(@"刷新ui");

//        });

//    });

//method2:创建一个concurrentQueue 不常用

dispatch_queue_t queue = dispatch_queue_create("adddd", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

NSLog(@"任务1是否为主线程:%d,%@",[NSThread isMainThread],[NSThread currentThread]); // 0

});

}

//

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

//

//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//   dispatch_time poptiem =  dispatch_time(DISPATCH_TIME_NOW, (int64_t)3 * NSEC_PER_SEC);

//延时执行

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

NSLog(@"delay");

});

}

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

NSArray *arr = @[@"红楼梦",@"水浒传",@"西游记",@"三国演义"];

//使用CONCURRENT获取的queue为并发的,apply中并发执行数组长度个数的任务,第一个任务开始后,以后的任务也开始执行,输出的结果是无序的

//dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_queue_t queue = dispatch_queue_create("apply", DISPATCH_QUEUE_CONCURRENT);

//重复执行N遍 ^(size_t)  index随机的下表

dispatch_apply(4, queue, ^(size_t index) {

//        NSLog(@"dispatch_apply");

NSLog(@"%@",arr[index]);//无序的

NSLog(@"asdfas");

});

}

//group

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

//

dispatch_queue_t queue = dispatch_queue_create("group", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group =  dispatch_group_create();

//并发执行

dispatch_group_async(group, queue, ^{

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

NSLog(@"group1");

});

});

dispatch_group_async(group, queue, ^{

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

NSLog(@"group5");        });

});

//该group中的调用的方法不管是在那个队列,线程或其他位置,只有等他们全部执行完之后才会执行notify任务

dispatch_group_notify(group, queue, ^{

NSLog(@"already go!");//当该group所有task执行完之后才会执行该方法

});

}

//读写操作同时进行时.数据可能不一样

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

//

dispatch_queue_t queue = dispatch_queue_create("barrier", DISPATCH_QUEUE_CONCURRENT);

//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//    dispatch_queue_t queue = dispatch_queue_create("barrier", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

NSLog(@"20age");

});

dispatch_async(queue, ^{

NSLog(@"10000");

});

//barrier 之后的task永远在barrier执行之后才能执行(并发)

//也可以使用barrier实现同步执行

dispatch_barrier_async(queue, ^{

NSLog(@"xieru");

});

dispatch_async(queue, ^{

NSLog(@"henan");

});

dispatch_async(queue, ^{

NSLog(@"nan:");

});

dispatch_release(queue);

}

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

//

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

//可以写单例

NSLog(@"once");//只能执行一次

//        s = [[Singlton alloc]init];

//        return s;

});

}

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

dispatch_queue_t queue = dispatch_queue_create("syn", DISPATCH_QUEUE_CONCURRENT);

//等block执行完毕后才会执行下面的代码(串行)

dispatch_sync(queue, ^{

for (int i = 0; i<10; i++) {

NSLog(@"%d",i);

}

});

NSLog(@"ok");

dispatch_release(queue);

}

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

dispatch_queue_t queue = dispatch_queue_create("async_f", DISPATCH_QUEUE_CONCURRENT);

//context可以是任何类型的参数

dispatch_async_f(queue,@"context", fucntion);

dispatch_release(queue);

}

iOS GCD学习

时间: 2024-10-14 12:30:36

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

iOS GCD的常见API使用指南

iOS GCD使用指南 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率. Dispatch Queue Dispatch Queue是用来执行任务的队列,是GCD中最基本的元素之一. Dispatch

iOS GCD中级篇 - dispatch_group的理解及使用

前文我们讲了GCD基础篇,以及同步.异步,并发.并行几个概率的理解. 参考链接: iOS GCD基础篇 - 同步.异步,并发.并行的理解 现在讲一下dispatch_group的概念以及几种场景下的使用 1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件. 最常见的几个方法: 1.dispatch_group_create创建一个调度任务组 2.dispatch_group_async 把一个任务异步提交到任务组里 3.dispatch_

ios学习笔记---ios完整学习路线

ios完整学习路线

ios开发学习资料总汇

ios开发学习资料总汇 下面是收集的一些学习资料. 1.唐巧精心整理了国内40多位iOS开发博主的博客地址列表 2.ios常见加密: 链接: http://pan.baidu.com/s/1eQTGFIE 密码: p8ay 3.

【iOS知识学习】_iOS动态改变TableView Cell高度

在做tableView的时候,我们有时候需要根据cell的高度动态来调整,最近在网上看到一段代码不错,跟大家Share一下. 在 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 类中获取cell的高度: CGSize boundSize = CGSizeMake(216, CGFLOAT_MAX); cell.textLabel.text

IOS开发学习笔记-(2)键盘控制,键盘类型设置,alert 对话框

一.关闭键盘,放弃第一响应者,处理思路有两种 ① 使用文本框的 Did End on Exit 绑定事件 ② UIControl on Touch 事件 都去操作 sender 的  resignFirstResponder #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField *txtUserName; @pro

ios网络学习------11 原生API文件上传之断点续传思路

#import "MainViewController.h" @interface MainViewController () @end @implementation MainViewController - (void)viewDidLoad { [super viewDidLoad]; //下载文件 [self download]; } -(void)download { //1. NSURL NSURL *url = [NSURL URLWithString:@"ht

ios网络学习------8 xml格式数据的请求处理 用代码块封装

#pragma mark 加载xml - (void)loadXML { //获取网络数据. NSLog(@"load xml"); //从web服务器加载数据 NSString *str = @"http://www.baidu.com?format=xml"; //这里是乱写的 //1简历NSURL NSURL *url = [NSURL URLWithString:str]; //2建立NSURLRequest NSURLRequest *request =