iOS 中多线程的简单使用
Posted 菜鸟工程司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 中多线程的简单使用相关的知识,希望对你有一定的参考价值。
ios中常用的多线程操作有(
NSThread,
NSopretion
CGD
)
为了能更直观的展现多线程操作在SB中做如下的界面布局:
当点击下载的时候从网络上下载图片:
- (void)loadImgFromURl{ NSURL *url=[NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1456920204&di=dd5436b6925ec27e1a13243f425b3586&src=http://img.wallpapersking.com/d7/2012-8/2012081210373.jpg"]; NSData *data=[NSData dataWithContentsOfURL:url]; // NSData *data1=[NSData dataWithContentsOfURL:url]; // NSData *data2=[NSData dataWithContentsOfURL:url]; 延长下载时间 // [self performSelectorOnMainThread:@selector(upImgView:) withObject:data waitUntilDone:YES];//更新UI在主线程中 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self upImgView:data]; }]; }
- (void)upImgView:(NSData *)data{ self.imgView.image = [UIImage imageWithData:data]; }
- 使用NSThread实现图片的异步加载
1.类方法:
[NSThread detachNewThreadSelector:@selector(loadImgFromURl) toTarget:self withObject:nil];
2.实例方法:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImgFromURl) object:nil];
[thread start];
二:NSOpreation
-使用NSOPreation的子类NSInvocationOperation:
NSInvocationOperation *invoca = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImgFromURl) object:nil];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//创建完NSInvocationOperation对象并不会调用,它由一个start方法启动操作,但是注意如果直接调用start方法,则此操作会在主线程中调用,一般不会这么操作,而是添加到NSOperationQueue中
// [invocationOperation start];
[queue addOperation:invoca];
2.使用NSOPreation的子类NSBlockOperation:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount =5;//最大的并发数量
//1直接通过队列添加
[queue addOperationWithBlock:^{
[self loadImgFromURl];
}];
// //2先生成NSBlockOperation实例子在添加
// NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock:^{
// [self loadImgFromURl];
// }];
// [queue addOperation:bop];
三:GCD在iOS中最常用
GCD跟NSOpreation都是通过队列的形式来操作。只是GCD并不是面向对象的,它有两种队列操作方式
1.串行队列 2.并行队列
顾名思义串行是按顺序来执行操作,而并行队列是按并行的方式来执行。
//窜行队列
dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);
//并行队列
dispatch_queue_t conqeue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);//全局的并行队列
GCD的执行方式有两种一种是同步的一种是异步的
- 同步的
dispatch_sync(queue, ^{
[self loadImgFromURl];
});
dispatch_sync(conqeue, ^{
[self loadImgFromURl];
});
此时可以发现使用同步执行的时候无论队列的串行还是并行的在下载的时候测试按钮都无法点击。
异步的:
dispatch_async(queue, ^{
[self loadImgFromURl];
});
此时不会阻塞主线程;
结论:
在GDC中一个操作是多线程执行还是单线程执行取决于当前队列类型和执行方法,只有队列类型为并行队列并且使用异步方法执行时才能在多个线程中执行。
串行队列可以按顺序执行,并行队列的异步方法无法确定执行顺序。
UI界面的更新最好采用同步方法,其他操作采用异步方法。
以上是关于iOS 中多线程的简单使用的主要内容,如果未能解决你的问题,请参考以下文章