iOS網絡多線程 ---實現網絡加載圖片
案例要求:網絡加載圖片,隨機加載到設置好的視圖上
實現的效果圖如下:
具體代碼如下:
//
// ViewController.m
// 0603---NSOperationQueue
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong) NSMutableArray * imageArray;
@end
@implementation ViewController
#pragma mark - 懶加載
- (NSMutableArray *)imageArray
{
if (_imageArray==nil)
{
_imageArray=[NSMutableArray array];
}
return _imageArray;
}
#pragma mark - 入口
- (void)viewDidLoad {
[super viewDidLoad];
//加載視圖
[self _loadViews];
//開啟多線程加載圖片
[self _loadThread];
}
- (void)_loadViews
{
for (int i=; i<15; i++)
{
int col=i%3;
int row=i/3;
UIImageView * imageView=[[UIImageView alloc]initWithFrame:CGRectMake(22+col*(80+45), 40+row*(100+20), 90, 90)];
imageView.backgroundColor=[UIColor redColor];
[self.imageArray addObject:imageView];
[self.view addSubview:imageView];
}
}
- (void)_loadThread
{
//開啟多線程
NSOperationQueue * queue=[[NSOperationQueue alloc]init];
for(int i=;i<self.imageArray.count;i++)
{
NSBlockOperation * block=[NSBlockOperation blockOperationWithBlock:^{
//下載圖片
NSString * imageSrc=@"http://images.cnblogs.com/cnblogs_com/kenshincui/613474/o_%d.jpg";
imageSrc=[NSString stringWithFormat:imageSrc,i]; //拼接字符串
NSURL * URL = [NSURL URLWithString:imageSrc];
NSData * data = [NSData dataWithContentsOfURL:URL];
UIImage * image=[UIImage imageWithData:data];
//獲取主線程,刷新UI
NSOperationQueue * queue2=[NSOperationQueue mainQueue];
[queue2 addOperationWithBlock:^{
//刷新圖片,給imageView賦值
UIImageView * imageView=self.imageArray[i];
imageView.image=image;
}];
}];
[queue addOperation:block];
}
}
@end
0602---小結:
多線程的三種創建方式
NSThread
1.實例方法:(調用start方法開啟多線程)
[NSThread alloc]initWithTarget:nil selector:nil withObject:nil];
2.類方法
[NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil];
3.刷新UI必須通過主線程
[self performSelectorOnMainThread:nil withObject:nil waitUntilDone:nil];
(*)4.隱式開啟多線程
[self performSelectorInBackground:nil withObject:nil];
0603- - - -NSOperationQueue
1.有對象方法,沒有類方法
創建多線程(4種方式):
// 1> 采用NSOperation的子類NSInvocationOperation來開啟多線程(必須添加到隊列)
NSInvocationOperation * nvo=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(show) object:nil];
[queue addOperation:nvo];
// 2> 采用NSBlockOperation 來開啟多線程(必須添加到隊列)
NSBlockOperation * block=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"我是block");
}];
[queue addOperation:block];
// 3> 采用隊列(不須重新添加到隊列)
[queue addOperationWithBlock:^{
NSLog(@"我是queue創建的block");
}];
// 4>
NSBlockOperation * block=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSBlockOperation");
}];
[block addExecutionBlock:^{
NSLog(@"NSBlockOperation===1");
}];
[block addExecutionBlock:^{
NSLog(@"NSBlockOperation===2");
}];
[block addExecutionBlock:^{
NSLog(@"NSBlockOperation===3");
}];
[block start];
2.指定線程的執行順序- - - 依賴(addDependency)
//創建block1
NSBlockOperation * block1=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"我是block1");
}];
[queue addOperation:block1]; //添加到隊列
//創建block2
NSBlockOperation * block2=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"我是block2");
}];
[block2 addDependency:block1]; //依賴---先后執行順序(block1 > block2)
[queue addOperation:block2]; //添加到隊列
3.刷新UI
//開啟多線程
NSOperationQueue * queue=[[NSOperationQueue alloc]init];
NSBlockOperation * block=[NSBlockOperation blockOperationWithBlock:^{
//下載圖片
{
}
//獲取主線程,刷新UI
NSOperationQueue * queue2=[NSOperationQueue mainQueue];
[queue2 addOperationWithBlock:^{
//刷新圖片,給imageView賦值
{
}
}];
}];
[queue addOperation:block];