多线程的简单使用
来源:互联网 发布:帝国cms newstxt修改 编辑:程序博客网 时间:2024/05/20 04:10
//// ViewController.m// 多线程处理//// Created by apple on 16/6/2.// Copyright © 2016年 李重阳. All rights reserved.//#import "ViewController.h"static NSInteger const AddTag = 100;@interface ViewController ()@property (nonatomic,strong) UIImageView * imageView;@property (nonatomic,strong) NSArray * urlArr;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; self.urlArr = @[@"http://weixue.steptowin.com:8000/data/img/20160411/veuyytthy4b2_320_200.jpg", @"http://weixue.steptowin.com:8000/data/img/20160528/qcxt7ow9syjo.png", @"http://weixue.steptowin.com:8000/data/img/20160527/zeol7j6gsto9.png", @"http://weixue.steptowin.com:8000/data/img/20160413/wag5q4elonh4_320_200.jpg", @"http://weixue.steptowin.com:8000/data/img/20160411/veuyytthy4b2_320_200.jpg", @"http://weixue.steptowin.com:8000/data/img/20160528/qcxt7ow9syjo.png", @"http://weixue.steptowin.com:8000/data/img/20160527/zeol7j6gsto9.png", @"http://weixue.steptowin.com:8000/data/img/20160413/wag5q4elonh4_320_200.jpg", @"http://weixue.steptowin.com:8000/data/img/20160411/veuyytthy4b2_320_200.jpg", @"http://weixue.steptowin.com:8000/data/img/20160528/qcxt7ow9syjo.png", @"http://weixue.steptowin.com:8000/data/img/20160527/zeol7j6gsto9.png", @"http://weixue.steptowin.com:8000/data/img/20160413/wag5q4elonh4_320_200.jpg"]; /*简单线程**/ //[self thread]; /* 队列操作**/ //[self operation]; /*GCD**/ [self GCD];}/********** 线程Thread 操作 ************/- (void)thread { _imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; [self.view addSubview:_imageView]; UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame=CGRectMake(50, 500, 220, 25); [button setTitle:@"加载图片" forState:UIControlStateNormal]; //添加方法 [button addTarget:self action:@selector(threadClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];}- (void)threadClick { [NSThread detachNewThreadSelector:@selector(threadRun) toTarget:self withObject:nil];}- (void)threadRun { NSLog(@"callMainbefore_1"); NSURL *url=[NSURL URLWithString:self.urlArr.firstObject]; NSData *data=[NSData dataWithContentsOfURL:url]; NSLog(@"callMainbefore_2"); /* 直到 updateUI: 做完了 是否才开始往下操作 waitUntilDone:NO 2016-06-02 17:13:47.618 多线程处理[10042:208753] callMainbefore_1 2016-06-02 17:13:47.673 多线程处理[10042:208753] callMainbefore_2 2016-06-02 17:13:47.674 多线程处理[10042:208753] callMainAfter 2016-06-02 17:13:52.675 多线程处理[10042:208668] callMain waitUntilDone:YES 2016-06-02 17:16:05.525 多线程处理[10062:210446] callMainbefore_1 2016-06-02 17:16:05.607 多线程处理[10062:210446] callMainbefore_2 2016-06-02 17:16:10.609 多线程处理[10062:210347] callMain 2016-06-02 17:16:10.613 多线程处理[10062:210446] callMainAfter **/ [self performSelectorOnMainThread:@selector(updateUI:) withObject:data waitUntilDone:YES]; NSLog(@"callMainAfter");}- (void)updateUI:(NSData *)imageData { sleep(5); NSLog(@"callMain"); self.imageView.image = [UIImage imageWithData:imageData];}/********** 线程Thread 结束 ************//********** 队列 操作 ************/- (void)operation { CGFloat space = 10; CGFloat imageWH = (320 - 10*5)/4.0; for (NSInteger i = 0 ; i < self.urlArr.count; i++) { UIImageView * imageView = [[UIImageView alloc]init]; [self.view addSubview:imageView]; imageView.frame = CGRectMake(space +(space+imageWH)*(i%4), space +(space+imageWH)*(i/4), imageWH, imageWH); imageView.tag = AddTag + i; } UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame=CGRectMake(50, 500, 220, 25); [button setTitle:@"加载图片" forState:UIControlStateNormal]; [button addTarget:self action:@selector(operationClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];}- (void)operationClick { NSOperationQueue * queue = [[NSOperationQueue alloc]init]; queue.maxConcurrentOperationCount = 2; __weak typeof(self)weakSelf = self; for (NSInteger i = 0 ; i < self.urlArr.count; i++) { UIImageView * imageView = [self.view viewWithTag:AddTag+i]; imageView.image = nil; NSBlockOperation * blockOp = [NSBlockOperation blockOperationWithBlock:^{ NSURL *url=[NSURL URLWithString:weakSelf.urlArr[i]]; NSData *data=[NSData dataWithContentsOfURL:url]; dispatch_async(dispatch_get_main_queue(), ^{ //更新UI 需要主线程 imageView.image = [UIImage imageWithData:data]; }); }]; if (i >0) { /* 就是 依赖前面的**/ NSBlockOperation * preOperation = queue.operations[i-1]; [blockOp addDependency:preOperation]; } [queue addOperation:blockOp]; }}/********** 队列 操作结束 ************//****************** GCD ******************/- (void)GCD { CGFloat space = 10; CGFloat imageWH = (320 - 10*5)/4.0; for (NSInteger i = 0 ; i < self.urlArr.count; i++) { UIImageView * imageView = [[UIImageView alloc]init]; [self.view addSubview:imageView]; imageView.frame = CGRectMake(space +(space+imageWH)*(i%4), space +(space+imageWH)*(i/4), imageWH, imageWH); imageView.tag = AddTag + i; } UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame=CGRectMake(50, 500, 220, 25); [button setTitle:@"加载图片" forState:UIControlStateNormal]; //添加方法 [button addTarget:self action:@selector(GCDClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];}/* 串行执行**/- (void)GCDClick { __weak typeof(self)weakSelf = self; dispatch_queue_t serialQueue = dispatch_queue_create("LeeGCDQueue", DISPATCH_QUEUE_SERIAL); for (NSInteger i = 0 ; i < self.urlArr.count; i++) { UIImageView * imageView = [self.view viewWithTag:AddTag+i]; imageView.image = nil; dispatch_async(serialQueue, ^{ NSURL *url=[NSURL URLWithString:weakSelf.urlArr[i]]; NSData *data=[NSData dataWithContentsOfURL:url]; dispatch_async(dispatch_get_main_queue(), ^{ //更新UI 需要主线程 imageView.image = [UIImage imageWithData:data]; }); }); }}///* 并发执行**///- (void)GCDClick {// // __weak typeof(self)weakSelf = self;// dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// for (NSInteger i = 0 ; i < self.urlArr.count; i++) {// UIImageView * imageView = [self.view viewWithTag:AddTag+i];// imageView.image = nil;// dispatch_async(globalQueue, ^{// // NSURL *url=[NSURL URLWithString:weakSelf.urlArr[i]];// NSData *data=[NSData dataWithContentsOfURL:url];// dispatch_async(dispatch_get_main_queue(), ^{// // //更新UI 需要主线程// imageView.image = [UIImage imageWithData:data];// });// // // });// // }// //}/****************** GCD 结束 ******************/@end
0 0
- 多线程的简单使用
- 多线程的简单使用
- python多线程的简单使用
- Executors多线程的简单使用
- Android多线程的简单使用
- 多线程+队列的简单使用
- JAVA多线程的简单使用
- JAVA 多线程的简单使用
- 简单的Java多线程的使用
- 【1】多线程的简单介绍和使用
- c++中多线程的简单使用
- iOS 多线程之GCD的简单使用
- 现实中多线程简单的使用
- 代理模式以及多线程的简单使用
- 网络多线程-NSOperation的简单使用
- linux程序多线程互斥锁的简单使用
- 多线程:扩充:BlockKit 的简单使用
- iOS 多线程简单使用的详解
- codeforces 115A
- 桶排序——java
- 快速查看Android Docs文档
- 获得android 应用的版本和当前android系统版本
- Windows下更改MySQL数据库的存储位置
- 多线程的简单使用
- 为什么一般hashtable的桶数会取一个素数
- #18 – Silverlight and WPF Differences(Silverlight和WPF的区别)
- 高德地图在个别机型手机上运行崩溃的问题
- Centos6.5下mysql忘记root密码
- Tomcat自带DBCP数据库连接池配置
- ClassLoader的一个应用场景
- easyui 设置无效 jquery-easyui-1.3.6
- Android studio常用快捷键