在iOS操作系统中,每一个进程都会有且只有一个主线程,也把这个线程叫做UI线程。UI的刷新都是在主线程中进行的。同时,一个进程可以很多个其它的线程,主线程是这些线程的父线程。子线程一般都是独立于Cocoa Touch。所以,在下载图片资源、播放音频、处理图片等操作时,通常都是在子线程中进行的。
多线程的优点:
-多线程可以提高应用程序的感知响应能力。
-多线程可以提高应用程序在多核系统上的实时性。
iOS常用的多线程开发有三种方式:
- NSThread
//使用对象方法,第一个参数是需要执行的方法,第二个参数是方法的参数
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(方法名) object:nil];
//新创建的线程处于就绪状态,当系统调度的时候,才是真正执行。
[thread start];
//使用类方法
[NSThread detachNewThreadSelector:@selector(方法名) toTarget:self withObject:nil];
//使用主线程执行方法
[self performSelectorOnMainThread:@selector(刷新UI的方法名) withObject:imageData waitUntilDone:YES];
- NSOperation
NSOperation是一个抽象类,它有三个子类:NSBlockOperation、NSInvocationOperation以及自定义继承自NSOperation的类。
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:self selector:@selector(方法名) object:nil];
[operation start];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^
{
}];
[operation addExecutionBlock:^{
}];
[operation start];
//子线程下载图片
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperationWithBlock:^{
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
//主线程刷新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
}];
- GCD
dispatch_async(dispatch_get_global_queue(0, 0), ^{
});
dispatch_async(dispatch_get_main_queue(), ^{
});
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
double delayInSeconds = 1.0;
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^(void){
});
// 自定义dispatch_queue_t
dispatch_queue_t custom_queue = dispatch_queue_create("customQueue", NULL);
dispatch_async(custom_queue, ^{
});
dispatch_release(urls_queue);
//异步下载图片
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url = [NSURL URLWithString:urlStr];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
//主线程刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
});
网友评论