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字符串。
关于多线程,有串行和并行,同步异步之分,大多使用异步,同步和异步就不解释了,大家用的也都多。
串行和并行,看名字可以看出来,这就像是排队和插队的关系,串行是从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字符串。
相关文章推荐
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- IOS多线程编程之NSThread的使用
- iOS多线程编程之NSThread的使用
- iOS使用多线程提高数据并发访问 之一
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- IOS 多线程使用
- iOS使用多线程提高数据并发访问 之四
- 多线程的使用(4) - iOS多线程的三种方式
- IOS多线程 - 使用线程加载一张图片 - NSThread(1)(转)
- iOS使用多线程提高数据并发访问 之二
- IOS多线程编程之NSOperation和NSOperationQueue的使用
- ios学习:多线程一(简单使用)
- iOS多线程编程之NSThread的使用
- iOS多线程之NSThread的使用
- iOS多线程编程之NSThread的使用
- IOS多线程编程之NSThread的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- ios 中是否每一个对象(尤其是在使用多线程时),都要判断一下对象是否为nil,以防止程序闪退?
- iOS使用多线程提高数据并发访问 之三