学习多线程07(之前跟着小码哥视频学习了多线程,准备把学到的东西放到网上,便于参考。仅有视频,所以所有文字都是自己打的,同时也温习一下多线程)
扩展:
原子和非原子属性
OC在定义属性时有nonatomic和atomic两种选择
atomic:原子属性,为setter方法加锁(默认就是atomic),防止多条线程同时改值。
nonatomic:非原子性,不会为setter方法加锁(默认就是atomic),可能造成多条线程同时改值。
nonatomic和atomic对比
atomic:线程安全,需要消耗大量的资源。
nonatomic:非线程安全,适合内存小的移动设备。
iOS开发的建议所有的属性都声明称nonatomic。
尽量避免多线程抢夺同一块资源。
尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力。
博客原地址:http://blog.csdn.net/leemin_ios/article/details/51190403
线程之间的通信
什么是线程间通信
在一个线程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信。
线程间的通信体现
1个线程传递数据给另一个线程
在1个线程中执行完特定的任务后,转到另1个线程继续执行任务。
线程之间的通信常用方法:
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
事例:
#import "ViewController.h" @interface ViewController () //图片View @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } /** 按钮点击事件 */ - (IBAction)btnClick:(UIButton *)sender { [self downLoadImage]; } -(void)downLoadImage { //图片的网络路径 NSURL *url = [NSURL URLWithString:@"http://upload.ct.youth.cn/2016/0307/1457308228627.jpg"]; //计算代码耗时间 // CFTimeInterval begin = CFAbsoluteTimeGetCurrent(); // CFTimeInterval end = CFAbsoluteTimeGetCurrent(); // // NSLog(@"%f",end-begin); //测试耗时多久 // NSDate *date1 = [NSDate date]; // //根据图片的网络路径去下载图片数据 // NSData *data = [NSData dataWithContentsOfURL:url]; // NSDate *date2 = [NSDate date]; // NSLog(@"耗时:%f",[date2 timeIntervalSinceDate:date1]); //根据图片的网络路径去下载图片数据 NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; //回到主线程,显示图片YES:等待完成在执行。NO:不等待直接同时执行下面的 //方法1: [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES]; NSLog(@"1111"); //方法2 // [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; //方法3 // [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES]; } -(void)showImage:(UIImage *)image { self.imageView.image = image; NSLog(@"%@",[NSThread currentThread]); }