iOS網絡多線程 ---實現網絡加載圖片

pwmd 9年前發布 | 3K 次閱讀 Objective-C 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];

 本文由用戶 pwmd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!