多線程實現多圖片下載1

来源:http://www.cnblogs.com/langji/archive/2016/03/27/5325680.html
-Advertisement-
Play Games

展示效果如下: 大家可以看到這個界面很簡單,其實就是UITableView的佈局, 但是難點是在於如何從網上下載這些圖片,下載之後應如何進行存儲! 我們一步一步進行解析,先從單線程(主線程)進行多圖片下載 我們佈局上的文字及圖片的地址從plist文件中進行讀取 根據結構,我們自定義一個數據模型文件 ...


展示效果如下:

 

大家可以看到這個界面很簡單,其實就是UITableView的佈局,

但是難點是在於如何從網上下載這些圖片,下載之後應如何進行存儲!

 

我們一步一步進行解析,先從單線程(主線程)進行多圖片下載

我們佈局上的文字及圖片的地址從plist文件中進行讀取

根據結構,我們自定義一個數據模型文件

DDZApp.h

#import <Foundation/Foundation.h>

@interface DDZApp : NSObject

//圖標
@property (nonatomic,strong) NSString *icon;
//名字
@property (nonatomic,strong) NSString *name;
//下載量
@property (nonatomic,strong) NSString *download;


+ (instancetype)appWithDict:(NSDictionary *)dict;
@end

DDZApp.m

#import "DDZApp.h"

@implementation DDZApp

+ (instancetype)appWithDict:(NSDictionary *)dict {
    DDZApp *app = [[self alloc] init];
    [app setValuesForKeysWithDictionary:dict];
    return app;
}
@end

以下的都是視圖控制器中的代碼

ViewController.m

1.

@interface ViewController ()

//所有數據
@property (nonatomic,strong)NSArray *apps;
//記憶體緩存圖片
@property (nonatomic,strong)NSMutableDictionary *imgCache;

@end

第一個屬性用於存儲讀取plist文件中的內容,設置為屬性保存起來,就可以不用重覆讀取

第二個屬性用於保存從網上下載下來的圖片,也是為了不用重覆讀取

2.

@implementation ViewController

//讀取數據
- (NSArray *)apps {
    if (!_apps) {
        //從plist文件中讀取數據
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil]];
        
        NSMutableArray *appArray = [NSMutableArray array];
        
        for (NSDictionary *dict in dictArray) {
            [appArray addObject:[DDZApp appWithDict:dict]];
        }
        _apps = appArray;
    }
    
    return _apps;
}

//緩存圖片
- (NSMutableDictionary *)imgCache {
    if (!_imgCache) {
        //初始化
        _imgCache = [NSMutableDictionary dictionary];
    }
    return _imgCache;
}

這兩個方法都是為了初始化剛纔的兩個屬性

3.

#pragma mark - 數據源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.apps.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *ID = @"app";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    DDZApp *app = self.apps[indexPath.row];
    

    cell.textLabel.text = app.name;
    cell.detailTextLabel.text = app.download;
    
    
    //先從記憶體中取出圖片
    UIImage *image = self.imgCache[app.icon];
    if (image) {
        cell.imageView.image = image;
    }else {
        //記憶體中沒有圖片

        //將圖片文件數據寫入到沙盒中
        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
        //獲得文件名
        NSString *filename = [app.icon lastPathComponent];
        //計算出文件的全路徑
        NSString *file = [cachesPath stringByAppendingPathComponent:filename];
        //載入沙盒的文件數據
        NSData *data = [NSData dataWithContentsOfFile:file];
        
        //判斷沙盒中是否有圖片
        if (data) {
            //直接載入沙盒中圖片
            cell.imageView.image = [UIImage imageWithData:data];
            //存到字典(記憶體)中
            self.imgCache[app.icon] = cell.imageView.image;
            
        }else {
            //下載圖片
            data = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]];
            
            cell.imageView.image = [UIImage imageWithData:data];
            //存到記憶體中
            self.imgCache[app.icon] = cell.imageView.image;
            
            //將圖片數據寫入到沙盒中
            [data writeToFile:file atomically:YES];
        }

       
    }
    return cell;
}
View Code

這兩個方法是UITableView必須要實現的方法

第一個是返回數據量,沒什麼好說的

第二個是綁定數據

 

具體的流程看下圖

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 將瀏覽器預設的下拉框樣式清除,然後應用上自己的,再附一張向右對齊小箭頭的圖片即可。 IE8/9並不支持 appearance:none CSS屬性,想要支持的話可能需要非常特殊的方法,參考SF: 我們需要為其添加一個父容器,容器是用來覆蓋小箭頭的,然後為select添加一個向右的小偏移或者寬度大於父 ...
  • 首先我要解釋一下標題的意義,日期的簡潔格式展示,之所以簡介,是因為讓人一目瞭然,不需要思考是什麼時候。 在詳細一點就是我們在微信朋友圈中 所看到的時間格式。 例如:剛剛 -幾分鐘前-幾小時前等等。 今天這裡帶來的是一個簡單的類別。 方便實用。 以及簡單的實際應用。 先看看一看類別是什麼樣子的 .h ...
  • 新手瞭解 有不對的地方指點下 首先, 瞭解下什麼是GIT,GIT是一款開元的分散式版本控制工具, 在世界上的所有分散式版本控制工具中,GIT是最簡單,最流行,同時也是最常用的 相比於其他版本的控制工具而言,GIT也有著自己的特點 舉個例子,GIT與集中式版本控制中的SVN相比來說,區別主要在於以下幾 ...
  • 在現在這個離不開手機的時代,對於手機APP的開發也是一個很大的市場,所以自己也想去探一探手機APP開發,在我們進行Android開發的第一步就是搭建環境,具體怎麼搭建我就不說,這裡記錄一下在搭建環境的過程中遇到的一些問題,來幫助遇到相同問題的童鞋。 1、點擊安卓模擬器就會出現一個錯誤消息:Locat ...
  • 一、概述 Xfermode全名transfer-mode,其作用是實現兩張圖疊加時的混合效果。 網上流傳的關於Xfermode最出名的圖來源於AndroidSDK的samples中,名叫Xfermodes.java,效果如下: [轉載請保留本文地址:http://www.cnblogs.com/go ...
  • 工具類 Activity ...
  • 這是深入淺出React Native教程的第二篇文章。 1. 環境配置 React Native環境配好之後,就可以開始創建我們的第一個App啦。 打開控制台,輸入 上述命令的作用是在當前文件夾下創建一個名字叫AwesomeProject的項目模板。在運行該命令之前,可以先用cd命令到自己想創建re ...
  • 一首先下載Jar包 https://github.com/square/okhttp 如果使用android studio只需要加入依賴 二--下載一張圖片並顯示 使用的是hanlder的方式 也可以把網路請求寫為一個工具類, get方式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...