多线程学习07-线程间通信

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


你可能感兴趣的:(iOS,多线程,Objective-C)