日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 开发-文件下载原理

發布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 开发-文件下载原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 文件上傳
  • 創建文件上傳類FileDownload.h // // FileDownload.h // 01.文件下載 // // Created by wyh on 15-1-29. // Copyright (c) 2015年 itcast. All rights reserved. // #import <Foundation/Foundation.h>@interface FileDownload : NSObject- (void)downloadFileWithURL:(NSURL *)url completion:(void (^)(UIImage *image))completion;@end

    ?

  • 創建文件上傳類FileDownload.m // // FileDownload.m // 01.文件下載 // // Created by wyh on 15-1-29. // Copyright (c) 2015年 itcast. All rights reserved. // #import "FileDownload.h" #import "NSString+Password.h"#define kTimeOut 2.0f // 每次下載的字節數 #define kBytesPerTimes 20250@interface FileDownload() @property (nonatomic, strong) NSString *cacheFile; @property (nonatomic, strong) UIImage *cacheImage; @end@implementation FileDownload /**為了保證開發的簡單,所有方法都不使用多線程,所有的注意力都保持在文件下載上在開發中如果碰到比較繞的計算問題時,建議:1> 測試數據不要太大2> 測試數據的數值變化,能夠用筆算計算出準確的數值3> 編寫代碼對照測試*/ //- (NSString *)cacheFile //{ // if (!_cacheFile) { // NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; // _cacheFile = [cacheDir stringByAppendingPathComponent:@"123.png"]; // } // return _cacheFile; //} - (UIImage *)cacheImage {if (!_cacheImage) {_cacheImage = [UIImage imageWithContentsOfFile:self.cacheFile];}return _cacheImage; }- (void)setCacheFile:(NSString *)urlStr {NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];urlStr = [urlStr MD5];_cacheFile = [cacheDir stringByAppendingPathComponent:urlStr]; }- (void)downloadFileWithURL:(NSURL *)url completion:(void (^)(UIImage *image))completion {// GCD中的串行隊列異步方法dispatch_queue_t q = dispatch_queue_create("cn.itcast.download", DISPATCH_QUEUE_SERIAL);dispatch_async(q, ^{NSLog(@"%@", [NSThread currentThread]);// 把對URL進行MD5加密之后的結果當成文件名self.cacheFile = [url absoluteString];// 1. 從網絡下載文件,需要知道這個文件的大小long long fileSize = [self fileSizeWithURL:url];// 計算本地緩存文件大小long long cacheFileSize = [self localFileSize];if (cacheFileSize == fileSize) {dispatch_async(dispatch_get_main_queue(), ^{completion(self.cacheImage);});NSLog(@"文件已經存在");return;}// 2. 確定每個數據包的大小long long fromB = 0;long long toB = 0;// 計算起始和結束的字節數while (fileSize > kBytesPerTimes) {// 20480 + 20480// toB = fromB + kBytesPerTimes - 1;// 3. 分段下載文件 [self downloadDataWithURL:url fromB:fromB toB:toB];fileSize -= kBytesPerTimes;fromB += kBytesPerTimes;}[self downloadDataWithURL:url fromB:fromB toB:fromB + fileSize - 1];dispatch_async(dispatch_get_main_queue(), ^{completion(self.cacheImage);}); }); }#pragma mark 下載指定字節范圍的數據包 /**NSURLRequestUseProtocolCachePolicy = 0, // 默認的緩存策略,內存緩存NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地的內存緩存NSURLRequestReloadIgnoringCacheData*/ - (void)downloadDataWithURL:(NSURL *)url fromB:(long long)fromB toB:(long long)toB {NSLog(@"數據包:%@", [NSThread currentThread]);NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:kTimeOut];// 指定請求中所要GET的字節范圍NSString *range = [NSString stringWithFormat:@"Bytes=%lld-%lld", fromB, toB];[request setValue:range forHTTPHeaderField:@"Range"];NSLog(@"%@", range);NSURLResponse *response = nil;NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];// 寫入文件,覆蓋文件不會追加 // [data writeToFile:@"/Users/aplle/Desktop/1.png" atomically:YES]; [self appendData:data];NSLog(@"%@", response); }#pragma mark - 讀取本地緩存文件大小 - (long long)localFileSize {// 讀取本地文件信息NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:self.cacheFile error:NULL];NSLog(@"%lld", [dict[NSFileSize] longLongValue]);return [dict[NSFileSize] longLongValue]; }#pragma mark - 追加數據到文件 - (void)appendData:(NSData *)data {// 判斷文件是否存在NSFileHandle *fp = [NSFileHandle fileHandleForWritingAtPath:self.cacheFile];// 如果文件不存在創建文件if (!fp) {[data writeToFile:self.cacheFile atomically:YES];} else {// 如果文件已經存在追加文件// 1> 移動到文件末尾 [fp seekToEndOfFile];// 2> 追加數據 [fp writeData:data];// 3> 寫入文件 [fp closeFile];} }#pragma mark - 獲取網絡文件大小 - (long long)fileSizeWithURL:(NSURL *)url {// 默認是GETNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:kTimeOut];// HEAD 頭,只是返回文件資源的信息,不返回具體是數據// 如果要獲取資源的MIMEType,也必須用HEAD,否則,數據會被重復下載兩次request.HTTPMethod = @"HEAD";// 使用同步方法獲取文件大小NSURLResponse *response = nil;[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];// expectedContentLength文件在網絡上的大小NSLog(@"%lld", response.expectedContentLength);return response.expectedContentLength; }@end

    ?

  • 控制器中調用 // // ViewController.m // 01.文件下載 // // Created by wyh on 15-1-29. // Copyright (c) 2015年 itcast. All rights reserved. // #import "ViewController.h" #warning 包含FileDownload.h文件 #import "FileDownload.h"@interface ViewController () @property (nonatomic, strong) FileDownload *download; @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad]; #warning 創建FileDownload對象,并調用方法downloadFileWithURL:self.download = [[FileDownload alloc] init];[self.download downloadFileWithURL:[NSURL URLWithString:@"http://localhost/itcast/images/head4.png"] completion:^(UIImage *image) {self.imageView.image = image;}]; }@end

    ?

  • 轉載于:https://www.cnblogs.com/wangyinghui/p/4356711.html

    總結

    以上是生活随笔為你收集整理的iOS 开发-文件下载原理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成人一级毛片 | 一区二区国产欧美 | 日韩在线视频在线观看 | 五月婷婷激情在线 | 大肉大捧一进一出好爽视频 | 特黄一区二区三区 | 日韩精品字幕 | 国产日韩一区二区在线观看 | 国产熟女一区二区三区五月婷 | 亚洲午夜免费视频 | 在线中文视频 | 国产农村妇女毛片精品久久麻豆 | 欧美午夜免费 | 免费av电影网站 | 亚洲黄色网址大全 | 超碰黑丝| 一级性生活免费视频 | 黄色免费入口 | 成人靠逼视频 | 中文字幕高清一区 | 成年人看的毛片 | 在线免费观看的av | 久久成人亚洲 | 日日日网站 | 成人黄色在线观看视频 | 国产永久在线观看 | 日本一级淫片色费放 | 内射合集对白在线 | 加勒比av在线播放 | 不卡一二区| 国产福利久久 | 国产区久久 | 影音先锋在线中文字幕 | 麻豆传媒一区二区三区 | 手机av在线播放 | 大黑人交xxx极品hd | 青青青青草 | 三级黄色片免费观看 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 日本欧美一级片 | 国产精品入口夜色视频大尺度 | 一卡二卡三卡 | 日韩毛片视频 | 七月丁香婷婷 | 精品人人 | 成人手机视频 | 2018自拍偷拍 | 成人18网站 | 尹人成人网 | 日韩精品在线免费观看视频 | 国产精品精东影业 | 亚洲成人av一区二区三区 | 久草在| 亚洲综人 | 午夜激情电影院 | 国产第9页| 女女h百合无遮羞羞漫画软件 | 91丝袜国产在线播放 | 精品人妻天天爽夜夜爽视频 | 男女视频久久 | 亚洲专区在线视频 | 动漫av在线 | 国产精品ww| 日韩精品一区二区在线看 | 亚洲一区二区精品视频 | 黑人巨大精品欧美一区二区 | 淫辱的世界(调教sm)by | 娇小萝被两个黑人用半米长 | 自拍亚洲综合 | 污片免费看 | 久草a视频 | 日本xxxx裸体xxxx出水 | 在线精品亚洲欧美日韩国产 | 精品视频久久久久久 | 99在线视频精品 | 精品国产91久久久久久 | 免费av在线播放网址 | 免费中文字幕日韩 | 日日天天 | 久久午夜无码鲁丝片午夜精品 | 久久影院一区二区 | 亚洲熟妇无码乱子av电影 | 欧美一区二区三 | 男人操女人免费 | 精东影业一区二区三区 | 久久综合社区 | 夜夜嗨av色一区二区不卡 | 日本性生活一级片 | 中文字幕无产乱码 | 操综合 | 欧美一区二区三区激情啪啪 | 91老师片黄在线观看 | 自拍99页 | 国产精品永久在线观看 | 色欲亚洲Av无码精品天堂 | 国产69视频在线观看 | 欧美日韩在线观看一区二区 | 亚洲最新在线视频 | 大学生高潮无套内谢视频 |