1. 程式人生 > >iOS非同步載入網路圖片

iOS非同步載入網路圖片

在iOS中載入網路圖片有多種方式:

法1:在主執行緒中同步載入網路圖片

在主執行緒中載入圖片,先將圖片的URL存放進NSURL,然後再用這個NSURL初始化NSData,再把UIImage用NSData初始化,就行了。程式碼如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    if ([tableView isEqual:self.tableView]) {
        cell.textLabel.text = @"Synchronized Loading";
        
        // synchronized image loading
        NSURL *imageURL = [NSURL URLWithString:@"http://www.i-programmer.info/images/stories/News/2011/MARCH/CMULOGO.jpg"];
        NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
        cell.imageView.image = [UIImage imageWithData:imageData];
    }
    return cell;
}
但是這種方法會阻塞主執行緒,也就是隻有等圖片這段程式碼執行後,頁面才能夠被進入。

法2:使用NSOperationQueue非同步載入

一個NSOperationQueue 操作佇列,就相當於一個執行緒管理器,而非一個執行緒。因為你可以設定這個執行緒管理器內可以並行執行的的執行緒數量。程式碼如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.title = @"NSOperationQueue非同步載入";
    [self.view addSubview:self.tableView];
    
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage) object:nil];
    [operationQueue addOperation:op];
}

- (void)downloadImage {
    NSURL *imageURL = [NSURL URLWithString:@"http://www.iconpng.com/png/socialnetworks2/linkedin.png"];
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
    UIImage *image = [UIImage imageWithData:imageData];
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}

- (void)updateUI:(UIImage*)image {
    self.image = image;
    [self.tableView reloadData];
}


法3:Cache快取+同步載入

第一次載入的時候用同步載入,同時把圖片快取到沙箱目錄中,第二次及以後的載入就直接從本地目錄中載入。

1)首先建立一個快取目錄

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString * diskCachePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"imageCache"];
    
    //如果目錄imageCache不存在,建立目錄
    if (![[NSFileManager defaultManager] fileExistsAtPath:diskCachePath]) {
        NSLog(@"fuck1");
        NSError *error = nil;
        [[NSFileManager defaultManager] createDirectoryAtPath:diskCachePath withIntermediateDirectories:YES attributes:nil error:&error];
    }

2)如果本地快取沒有,則儲存圖片到對應的路徑。若本地快取有圖片,則直接從快取中載入圖片
<pre name="code" class="objc">    for (int i = 0; i < self.urlArray.count; i++) {
        NSURL *imageURL = self.urlArray[i];
        
        // 如果本地快取沒有,儲存圖片
        NSString *localPath = [NSString stringWithFormat:@"%@/headimage%d.png", diskCachePath, i];
        if (![[NSFileManager defaultManager] fileExistsAtPath:localPath]) {
            NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
            [imageData writeToFile:localPath atomically:YES];
        }
        
        // 如果存在本地快取圖片,直接讀取cache內的快取圖片
        if ([[NSFileManager defaultManager] fileExistsAtPath:localPath]) {
            NSData *data = [NSData dataWithContentsOfFile:localPath];
            UIImage *image = [UIImage imageWithData:data];
            [self.imageArray addObject:image];
        }
    }



相關推薦

iOS 非同步載入網路圖片,獲取圖片真實尺寸

專案需求: 在網路上載入一組圖片的資料,並且這組圖片要按照比例展示出來 做法分析: (1)首頁介面上要是使用的圖片控制元件的建立,這裡的高度是用設定的高度,這部分需要在主執行緒完成; (2)第二部部分是獲取圖片的實際尺寸,這部分線上程中完成; (3)然後需要在主執行緒重新整

iOS非同步載入網路圖片

在iOS中載入網路圖片有多種方式: 法1:在主執行緒中同步載入網路圖片 在主執行緒中載入圖片,先將圖片的URL存放進NSURL,然後再用這個NSURL初始化NSData,再把UIImage用NSData初始化,就行了。程式碼如下: - (UITableViewCell *

IOS開發之非同步載入網路圖片並快取本地實現瀑布流(一)

</pre><pre name="code" class="objc"></pre><pre name="code" class="objc">在前面的一篇部落格中,我寫了一個瀑布流照片牆的程式,由於之前的程式載入的圖片是本

iOS開發swift版非同步載入網路圖片(帶快取和預設圖片)

iOS開發之swift版非同步載入網路圖片     與SDWebImage非同步載入網路圖片的功能相似,只是程式碼比較簡單,功能沒有SD的完善與強大,支援預設新增圖片,支援本地快取。      非同步載入圖片的核心程式碼如下:  func setZYHWebImage(ur

Android批量圖片載入經典系列——使用xutil框架快取、非同步載入網路圖片

一、問題描述   為提高圖片載入的效率,需要對圖片的採用快取和非同步載入策略,編碼相對比較複雜,實際上有一些優秀的框架提供瞭解決方案,比如近期在git上比較活躍的xutil框架   Xutil框架提供了四大模組: 1、  DbUtil模組:採用ORM機制簡化Sqlite操作,

Android批量圖片載入經典系列——採用二級快取、非同步載入網路圖片

public class AsyncImageLoader{ private MemoryCache mMemoryCache;//記憶體快取 private FileCache mFileCache;//檔案快取 private ExecutorService mExecu

廣告banner:手動滑動切換,自動切換,點選跳轉,非同步載入網路圖片

效果圖: 該banner功能有自動切換圖片,點選圖片可以自定義事件,手動滑動切換,非同步載入圖片 程式碼說話: 佈局檔案: <!-- 廣告位 --> <FrameLayout android:

UIImageView非同步載入網路圖片

方法1:在UI執行緒中同步載入網路圖片 UIImageView *headview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; NSURL *photourl

Android非同步載入網路圖片

Android圖片的非同步載入,主要原理: 載入圖片時先檢視快取中時候存在該圖片,如果存在則返回該圖片,否則先載入載一個預設的佔位圖片,同時建立一個通過網路獲取圖片的任務並新增,任務完成後放鬆訊息給主執行緒更新介面。 使用方法: Asyn

TextView使用自定義HtmlHttpImageGetter實現非同步載入網路圖片,可限制載入圖片數量

import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import androi

Android 非同步載入網路圖片到ImageView (Hnadler)

首先建立一個Handler private Handler handler=new Handler(){ @Override public void handleMessage(Mes

android textView 載入HTML 非同步載入網路圖片

/** * 重寫圖片載入介面 * * @author Ruffian * @date 2016年1月15日 * */ class HtmlImageGetter implements Html.ImageGetter { /** * 獲取圖片 */ @Ov

使用AsyncTask非同步更新UI介面(載入網路圖片

寫這個部落格時抽抽了,順便又用了一些WebView的東西,更多webview參見這裡 1.簡單介紹下AsyncTask AsyncTask,是android提供的輕量級的非同步類,可以直接繼承AsyncTask,在類中實現非同步操作,並提供介面反饋當前非同步執行的程度(可以

iOS富文字手動重新整理和非同步替換網路圖片

CSDN註冊好幾年一直沒用過於是乎今天心血來潮寫一篇技術交流貼,以供有需要的道友。 移動端iOS開發中,少不了遇到NSAttributedString(富文字字典集合)富文字形式進行圖文混排。如果想替換富文字內部某個位置的圖片,有一種方式是找到range,然後重新生成此

iOS NSThread 多執行緒載入網路圖片

.m 定義圖片連結 // 圖片連結 #define KURL @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1497938913914&am

android非同步回撥載入網路圖片

在做應用的時候很多時候都會去從網路載入圖片,而且還要做各種各樣的載入效果。比如,載入圖片的時候在圖片上顯示loading的圖片,圖片載入完成時loading消失,載入失敗又有相應的處理。如果處理不好就會很麻煩,下面總結了一個輕量級的從網路載入圖片方法。 package c

iOS 開發之 為UIButton新增類別方法載入網路圖片

UIButton+WebCache.h #import <UIKit/UIKit.h> // 為Button新增類別方法 @interface UIButton (WebCache) - (void)xr_setButtonImageWit

canvas 載入網路圖片遇到的問題

<canvas id="canvas" width="800" height="500">抱歉,您的瀏覽器不支援canvas元素</canvas> 之前是這樣寫的 var img = new Image();//表示嵌入一個影象物件例項 img.src = thi

Unity載入網路圖片並顯示在UGUI上,解決載入網路圖片出現問號的問題及其案例分析,例項Demo親測可用

Unity載入網路圖片並顯示在UGUI上,解決載入網路圖片出現問號的問題及其案例分析,例項Demo親測可用 最近自己在載入網路圖片的時候也遇到了載入的圖片無法顯示或者是問號的問題。下面就分析下為什麼會出現這樣的情況。   首先我們直接上程式碼(比較簡單) using U

Android之Volley框架載入網路圖片

更多幹貨 分散式實戰(乾貨) spring cloud 實戰(乾貨) mybatis 實戰(乾貨) spring boot 實戰(乾貨) React 入門實戰(乾貨) 構建中小型網際網路企業架構(乾貨) python 學習持續更