1. 程式人生 > >iOS-UIImageView載入網絡下載的圖片(異步+多線程)

iOS-UIImageView載入網絡下載的圖片(異步+多線程)

keyword users variable mapped error: aid 等待 ive spa

最原始的載入網絡下載的圖片方式:

//最原始載入網絡圖片方法,相當堵塞主線程,界面卡頓
-(void)setImageWithURL:(NSString *)imageDownloadUrl{
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(44, 64, 250, 250)];
    NSURL *URL = [NSURL URLWithString:imageDownloadUrl];
    NSError *ERROR;
    NSData *imageData = [NSData dataWithContentsOfURL:URL options:NSDataReadingMappedIfSafe error:&ERROR];
    UIImage
*image = [UIImage imageWithData:imageData]; [imageView setImage:image]; }

使用異步線程載入圖片,在載入完畢後設置圖片。能夠在網絡載入完畢之前。UIimageview先使用占位圖片。

//異步線程載入網絡下載圖片 ——> 回到主線程更新UI
-(void)downloadImageWithUrl:(NSString *)imageDownloadURLStr{
    //以便在block中使用
    __block UIImage *image = [[UIImage alloc] init];
    //圖片下載鏈接
NSURL *imageDownloadURL = [NSURL URLWithString:imageDownloadURLStr]; //將圖片下載在異步線程進行 //創建異步線程運行隊列 dispatch_queue_t asynchronousQueue = dispatch_queue_create("imageDownloadQueue", NULL); //創建異步線程 dispatch_async(asynchronousQueue, ^{ //網絡下載圖片 NSData格式 NSError *error; NSData *imageData = [NSData dataWithContentsOfURL:imageDownloadURL options:NSDataReadingMappedIfSafe error:&error]; if
(imageData) { image = [UIImage imageWithData:imageData]; } //回到主線程更新UI dispatch_async(dispatch_get_main_queue(), ^{ [_imageView setImage:image]; }); }); }

假設考慮到線程安全,須要開啟自己主動釋放池,此方法同上:

#pragma mark - 下載圖片-子線程調用
-(void)downloadImage{

    /**
     子線程裏面的runloop默認不開啟,也就意味著不會自己主動創建自己主動釋放池,子線程裏面autorelease的對象 就會沒有池子釋放。也就一位置偶棉沒有辦法進行釋放造成內存泄露
     所以須要手動創建

     */

    @autoreleasepool {

        NSLog(@"%@",[NSThread currentThread]);

        NSURL *url = [NSURL URLWithString:@"http://baidu.com/image/Users/qiuxuewei/Desktop/qiu.JPG"];

        NSData *data = [NSData dataWithContentsOfURL:url];

        UIImage *image0 = [UIImage imageWithData:data];

        UIImage *image = [UIImage imageNamed:@"qiu.JPG"];

        //UI要求在主線程中進行
        //self.imageView.image = image;

       //1、 [self performSelectorOnMainThread:@selector(updataImage:) withObject:image waitUntilDone:NO];
       //2、 [self performSelector:@selector(updataImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
        [self.imageView performSelectorOnMainThread:@selector(updataImage:) withObject:image waitUntilDone:YES];

        //waitUntilDone:  表示是否等待子線程方法運行完畢
        //假設是YES:那就等子線程方法運行完再運行當前函數
        NSLog(@"完畢..");
    }
}

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

    self.imageView.image = image;

}

iOS-UIImageView載入網絡下載的圖片(異步+多線程)