学习多线程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]);
}