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

iOS中多线程的使用

2016-11-23 16:27 211 查看
关于iOS多线程GCD是iOS的一大特色,继承与C语言中的多线程管理方式,每一个项目里面都有自己的一个线程,本文文采不好,只能贴出如何使用和一些简单的解释。

关于多线程,有串行和并行,同步异步之分,大多使用异步,同步和异步就不解释了,大家用的也都多。

串行和并行,看名字可以看出来,这就像是排队和插队的关系,串行是从1-2-3-4-5-6,有序,先入先出的原理,而并行不是,并行指的是同时进行,谁先结束谁后结束,没有办法确认。

多线程并不是两个线程同时进行,而是在两个线程之间交替进行,实际还是运行的同一个,只是他们以很快的速度进行着交替变化(比如我们下载电影,同时下载三个,并不是同时进行三个下载进程,而是一个下载进程在三个下载任务之间来回跳转,造成了三个同时都在运行的结果)

异步   串行队列使用

//异步 串行
dispatch_queue_t queue = dispatch_queue_create("ca", DISPATCH_QUEUE_SERIAL);

for (int i=0; i<10; i++)
{
void (^tast)()=^{
NSLog(@"打印出i的值是%d 当前线程%@",i,[NSThread currentThread]);
};
dispatch_async(queue, tast);
}

NSLog(@"打印出是否是异步加载");


上面的是异步加载,串行队列的使用,可以看一下控制台打印效果
"ca"是这个线程的id,和cell的id一样的感觉,后面的

DISPATCH_QUEUE_SERIAL这个是表示这个线程是串行还是并行
下面的dispatch_async表示异步加载


我们可以通过对比代码和控制台打印的数据,来参考异步和串行,我们可以看到代码中是先有的GCD然后打印出是否异步加载,然而控制台先打印出的是(是否异步加载),通过看打印出的i的参数可以看出是一个一个来的,有顺序打印执行的

异步  并行队列使用

代码和其中DISPATCH_QUEUE_CONCURRENT 表示是并行触发
//异步 并行
dispatch_queue_t queue_Concurrent = dispatch_queue_create("Concurrent", DISPATCH_QUEUE_CONCURRENT);
for (int i=0; i<10; i++)
{
void (^tast)()=^{
NSLog(@"打印出i的参数 %d",i);

};
dispatch_sync(queue_Concurrent, tast);
}
NSLog(@"打印是否异步");


可以看一下控制台打印的参数信息



可能是因为单纯打印出一个i的参数,进程结束的比较快。。。。所以打印出的参数还是有序的0-9,如果是稍微复杂一点的数据,显示的不一定会是有序的,这是并行的特性

同步  并行队列使用

我们看一下,同步加载的情况下,GCD串行和并行的效果如何

// 创建同步 并行
dispatch_queue_t queue1 = dispatch_queue_create("ck", DISPATCH_QUEUE_CONCURRENT);

// 循环创建10个同步任务,将10个同步任务添加到串行队列中
for (int i = 0; i < 10; i++) {
// 创建任务
void (^task)() = ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
};
// 将同步任务添加到串行队列
dispatch_sync(queue1, task);
}
NSLog(@"打印是否同步进行");
看出这一次的打印是按照OC语言的从上至下运行的,也就是说同步进行dispatch_sync是同步进行
控制台打印数据顺序和上面的异步一个道理,是因为打印i的进程太短,



同步  串行队列使用

再看一下同步,串行队列的代码和打印情况

//创建同步 串行
dispatch_queue_t queue = dispatch_queue_create("name", DISPATCH_QUEUE_SERIAL);

for (int i=0; i<10; i++)
{
void (^test)() = ^{
NSLog(@"打印出i的参数 %d",i);

};
dispatch_sync(queue, test);
};

NSLog(@"打印是否同步");

上面的同步串行队列的运行效果是



可以看到是有顺序的打印出数据

最后还有一个是

延时调用

延时调用我用的最多的也就是注册账号的时候发送验证码 QAQ 

代码如下   设定延迟时间   设置线程可以看一下下面的GIF图

dispatch_time_t time =dispatch_time(DISPATCH_TIME_NOW,5 * NSEC_PER_SEC);

//NSEC_PER_SEC 秒

//NSEC_PER_MSEC 毫秒

//NSEC_PER_USEC 微秒
dispatch_after(time,dispatch_get_main_queue(), ^{

NSLog(@"task 1");

});





可以明显的看到延时打印出来task 1字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息