【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
ios多线程之NSThread
##什么是线程: 一个进程想要执行任务,必须至少得有一个线程,但是只拥有一个主线程,线程是进程的基本执行单位,一个进程的所有任务必须在线程中执行。 ###线程的分类: **串行:**一个一个的按顺序执行。 **并行:**不按顺序执行,把一个或者多个任务分配给主线程或其他的线程进行。多线程的并发执行,其实是CPU快速的在多个线程之间的切换。CPU切换的速度足够快,就会造成多线程并发执行的假象。 ####ios中的:多线程编程技术: **1:**Pthread(基本不会使用)
**2:**NSThread(每个Thread对象对应一个线程)
**3:**NSOperation(面对对象的线程技术,基于GCD来实现,是对GCD的简单封装)
**4:**GCD(是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术) ##NSThread: 多线程技术,只有在程序下载或者执行一些大的数据的下载,复杂大数据的增添改查中,才能体现它的特点,所以,我们需要一些大的数据。而大的数据最好获得的是高清大图的数据,首先在storyboard中创建 imageview: ###方式一 @interface ViewController () {
NSThread *thread_A;
}
[@property](http://my.oschina.net/property) (weak, nonatomic) IBOutlet UIImageView *imagView_1;
####数据的下载: NSURL *imageURL_01 = [NSURL URLWithString:@"http://img.ivsky.com/img/tupian/pre/201507/01/yindian_meinv-001.jpg"]; NSData *data = [NSData dataWithContentsOfURL:imageURL_01]; return [UIImage imageWithData:data]; ####创建NSThread: NSThread *thread_A = [[NSThread alloc] initWithTarget:self selector:@selector(run_A) object:nil]; thread_A.name = @"线程A"; [thread_A start]; 创建线程、执行下载任务,需要手动start才能启动。而NSThread创建的线程任务不是在主线程中的,而凡是涉及到UI的更新,都是在主线程中完成的,所以我们需要把数据的更新操作让给主线程 ###完成数据的更新: UIImage *image = [self downloadImage_one]; [self.imagView_1 performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; downloadImage_one:为对image网络url数据的下载。performSelectorOnMainThread:OnMainThread在主线程上执行。把对UI数据的更新放在主线程上,才能让UI重新渲染。 ###方式二:
[NSThread detachNewThreadSelector:@selector(run_A) toTarget:self withObject:nil];
NewThread代表开辟一个行的线程,selector方法选择器。开辟一个新的线程来执行所选中的方法。使用方式二,就可以不用手动调用start方法,他会自动调用start方法。 ###方法三: 方法一二三,很多方法大同小异,最大的区别就在于创建线程的方法.
[self performSelectorInBackground:@selector(run_A) withObject:nil];
self当前,performSelectorInBackground:在后台中执行选中的方法,并传入一个对象。在后台中开辟线程与performSelectorOnMainThread是相对的。
###NSThread的一些方法:
####阻塞线程 [NSThread sleepForTimeInterval:5]; 等待x秒钟。类似于GCD中的延迟调用。
####线程暂停 [NSThread sleepUntilDate:[[NSDate date] dateByAddingTimeInterval:1000]]; 阻塞到某个时间,如果给他一个未来时间,就能让这个线程暂停:
[NSThread sleepUntilDate:[NSDate distantFuture]];
####取消当前进程
[thread_A cancel];
来源:oschina
链接:https://my.oschina.net/u/2892218/blog/741975