iOS线程间通信

//原子和非原子属性

//oc在定义属性nonatomicatomic两种选择

//atomic:原子属性 每调一回set方法,为set方法加锁  设值之前加把锁,设完值,锁打开。。。防止多线程访问值出现混乱状态

//nonatomic 非原子属性,不会为setter方法加锁

//atomic:线程安全,需要消耗大量的资源

//nonatomic 非线程安全,适合内存小的移动设备

//ios开发的建议:所有属性都声明为nonatomic

//尽量避免多线程抢夺统一资源

//尽量将加锁,资源抢夺的业务逻辑交给服务器端处理,减少移动客户端的压力

//线程间通信

//在一个进程中,线程往往不是独立存在的,多个线程之间需要经常进行通信

//线程间通信的体现

//1个线程传递数据为另外一个线程

//在一个线程中执行完特定任务后,转到另外一个线程继续执行任务

//线程间通信示列 -- 图片下载

//个人感觉重点

//主线程 添加UIImageView

//在主线程添加UIImageView 为什么:主线程是UI线程,显示控件,刷新UI控件内容等等

//子线程 :在子线程下载图片  在子线程下载完图片,下载完毕

//回到 在主线程 显示图片

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

  //  [self download2];

    [self performSelectorInBackground:@selector(download3) withObject:nil];

- (void)download1{

        


//图片下载原理

    self.imageV = [UIImageView new];

    self.imageV.frame = CGRectMake(0, 100, 100, 100);

    [self.view addSubview:self.imageV];

//    self.imageV.image UIImage imageName:这个是项目里的图片]

    //下载网络图片用NSData 二进制数据0101...那种数据

    //一个URL代表一个路径  不管是本地路径,远程路径都通过URL

    //图片的网络路径

    NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];

    //计算时间方法一

    NSDate *begin = [NSDate date];

    //根据图片的网络路径去下载图片数据

    NSData *data = [NSData dataWithContentsOfURL:url];

    //显示图片

    

   NSDate *end = [NSDate date];

    //计算时间间隔

    NSLog(@"%f",[end timeIntervalSinceDate:begin]);

   

    self.imageV.image = [UIImage imageWithData:data];

    

    


}


//计算时间方法二

- (void)download2{

    

    self.imageV = [UIImageView new];

    self.imageV.frame = CGRectMake(0, 100, 100, 100);

    [self.view addSubview:self.imageV];

    //self.imageV.backgroundColor = [UIColor redColor];

    //self.imageV.image UIImage imageName:这个是项目里的图片]

    //下载网络图片用NSData 二进制数据0101...那种数据

    //一个URL代表一个路径  不管是本地路径,远程路径都通过URL

    //图片的网络路径

    NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];

    

    

     //计算时间间隔

    CFTimeInterval begin = CFAbsoluteTimeGetCurrent();

    //根据图片的网络路径去下载图片数据

    NSData *data = [NSData dataWithContentsOfURL:url];

    //显示图片

     //计算时间间隔

    CFTimeInterval end = CFAbsoluteTimeGetCurrent();

    //计算时间间隔

    NSLog(@"%f",end -begin);

    

    self.imageV.image = [UIImage imageWithData:data];


}


- (void)download3{

    //图片的网络路径

    NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];

    

    //加载图片

    NSData *data = [NSData dataWithContentsOfURL:url];

    //    生成图片

    UIImage *image = [UIImage imageWithData:data];

    

    //下载完毕要回到主线程,显示图片

    //[self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];

    //回到主线程也可以

    [self.imageV performSelectorOnMainThread:@selector(setImage:) withObject:nil waitUntilDone:YES];

    //waitUntilDone:YES];等这个走完,才继续走   no就是不等,一起走

    

    //    回到主线程方法

    // self.imageV performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#> modes:<#(nullable NSArray<NSString *> *)#>

    //    回到主线程方法

    //    [self.imageV performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];

    

    

}

- (void)showImage:(UIImage *)image{

    self.imageV.image = image;

    //    打印线程,也可以这么打印

    NSLog(@"%d",[NSThread isMainThread]);

    //线程间通信还有  不怎么用面试可以搭一答

//    NSPort

//    NSMessagePort

//    NSMachPort

    

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值