iOS學習-10下載(1) NSURLConnection 篇

来源:http://www.cnblogs.com/asamu/archive/2016/04/22/5422425.html
-Advertisement-
Play Games

程式的實現需要藉助幾個對象: NSURLRequest:建立了一個請求,可以指定緩存策略、超時時間。和NSURLRequest對應的還有一個NSMutableURLRequest,如果請求定義為NSMutableURLRequest則可以指定請求方法(GET或POST)等信息。 NSURLConne ...


程式的實現需要藉助幾個對象:

NSURLRequest:建立了一個請求,可以指定緩存策略、超時時間。和NSURLRequest對應的還有一個NSMutableURLRequest,如果請求定義為NSMutableURLRequest則可以指定請求方法(GET或POST)等信息。

NSURLConnection:用於發送請求,可以指定請求和代理。當前調用NSURLConnection的start方法後開始發送非同步請求。

當然了這種方法比較原始。。。

//
//  ViewController.m
//  xiazai
//
//  Copyright © 2016年 asamu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<NSURLConnectionDataDelegate>
{
    NSMutableData *_data;//響應數據
    UITextField *_textField;
    UIButton *_button;
    UIProgressView *_progressView;
    UILabel *_label;
    long long _totalLength;
    NSDictionary *_musicDic;
}
@end

@implementation ViewController
#pragma mark -- UI方法
- (void)viewDidLoad {
    [super viewDidLoad];
    [self analysisJson];
    [self layoutUI];
    
}
#pragma mark -- 私有方法
#pragma mark  解析 JSON
-(void)analysisJson{
    NSError *error;
    NSString *str = @"http://douban.fm/j/mine/playlist?channel=3";
    NSURL *url = [NSURL URLWithString:str];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
    NSDictionary *musicDic = [[NSDictionary alloc]init];
    //遍歷字典 取出 key - @"song"
    for (musicDic in dic[@"song"]) {
        _musicDic = musicDic;
    }
}

#pragma mark 界面佈局
-(void)layoutUI{
    //地址欄
    _textField = [[UITextField alloc]initWithFrame:CGRectMake(10, 50, 300, 25)];
    //加圓角和邊框
    _textField.layer.cornerRadius = 3.0f;
    _textField.layer.borderWidth = 0.5f;
    _textField.textColor = [UIColor redColor];
     /*
     解析的 JOSN 中的 歌曲名加上 .mp3 的尾碼
     這個名字就是存儲在沙盒中的名字,所以要加 .mp3
     由於名稱不一樣,所以不會覆蓋
     */
    NSString *musicName = [_musicDic[@"title"] stringByAppendingString:@".mp3"];
    _textField.text = musicName;
    [_textField sizeToFit];
    [self.view addSubview:_textField];
    //進度條
    _progressView = [[UIProgressView alloc]initWithFrame:CGRectMake(10, 100, 300, 25)];
    [self.view addSubview:_progressView];
    //狀態顯示
    _label = [[UILabel alloc]initWithFrame:CGRectMake(10, 130, 300, 25)];
    _label.textColor = [UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0];
    [self.view addSubview:_label];
    //下載按鈕
    _button = [[UIButton alloc]initWithFrame:CGRectMake(10, 500, 300, 25)];
    [_button setTitle:@"下載" forState:UIControlStateNormal];
    [_button setTitleColor:[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0] forState:UIControlStateNormal];
    [_button addTarget:self action:@selector(sendRequest) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_button];
}
#pragma mark -- 更新進度
-(void)updateProgress{
    if (_data.length == _totalLength) {
        _label.text = @"Finish downloaded";
    }else{
        _label.text = @"downing...";
        [_progressView setProgress:(float)_data.length/_totalLength];
    }
}
#pragma mark -- 發送請求
-(void)sendRequest{
    NSLog(@"begin");
    NSString *urlStr = [NSString stringWithFormat:_musicDic[@"url"],_textField.text];
    //解碼
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    // 創建 URL 鏈接
    NSURL *url = [NSURL URLWithString:urlStr];
    //創建請求
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0f];
    //創建連接
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
    //啟動連接
    [connection start];
}
#pragma mark -- 連接代理方法
#pragma mark 開始響應
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"receive response");
    _data = [[NSMutableData alloc]init];
    _progressView.progress = 0;
    //通過響應頭中的 Content-Length 取得整個響應的長度
    NSHTTPURLResponse *httpRespose = (NSHTTPURLResponse *)response;
    NSDictionary *httpResponseHeaderFields = [httpRespose allHeaderFields];
    _totalLength = [[httpResponseHeaderFields objectForKey:@"Content-Length"]longLongValue];
}
#pragma mark 接收響應數據,(根據響應內容的大小此方法會被重覆調用)
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"Receive data");
    //連續接收數據
    [_data appendData:data];
    //更新進度
    [self updateProgress];
}
#pragma mark 接收數據完成
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"loading finish");
    //數據接收完保存文集(註意蘋果官方要求:下載數據只能保存在緩存目錄)
    NSString *savePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
    savePath = [savePath stringByAppendingPathComponent:_textField.text];
    [_data writeToFile:savePath atomically:YES];
    NSLog(@"path:%@",savePath);
}
#pragma mark 請求失敗
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"connection error,error detail is:%@",error.localizedDescription);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

參考 KenshinCui,估計大神的 url 沒用了,所以我換了個音樂的 url,可以用。初學者,若有錯誤,敬請指出,不甚感激。


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

-Advertisement-
Play Games
更多相關文章
  • ios開發學習中,經常弄不清楚ios的開發模式,今天我們就來進行簡單的總結和探討~ (一)代理模式 應用場景:當一個類的某些功能需要由別的類來實現,但是又不確定具體會是哪個類實現。 優勢:解耦合 敏捷原則:開放-封閉原則 實例:tableview的 數據源delegate,通過和protocol的配 ...
  • 使用NSURLSessionDownloadTask下載文件的過程與前面差不多,需要註意的是文件下載文件之後會自動保存到一個臨時目錄,需要開發人員自己將此文件重新放到其他指定的目錄中。 來自KenshinCui,鏈接見上篇。 ...
  • AFN小結 1,AFN概念、原理 2,AFN的封裝使用 3,AFN與其它框架對比 ————————————————————————————————— 1 , AFN的概念原理: AFN的基礎是NSURL,AFN的直接操作對象AFHTTPClient是一個實現了NSCoding和NSCopying協議 ...
  • 最近突然發現我的128G SSD硬碟只剩下可憐的8G多,剩下這麼少的一點空間連Xcode都無法更新。怎麼辦呢?如果升級硬碟的話,第一要花錢,畢竟SSD硬碟還是不便宜,第二是升級比較麻煩,要拆機和遷移系統什麼的特別花時間精力,老了真不願瞎折騰了,只能想辦法能不能清除點空間來。 尋找大塊頭 首先想到的就 ...
  • 一 KVC的基本概念 KVC是Key Value Coding的縮寫,意思是鍵值編碼。 在iOS中,提供了一種方法通過使用屬性的名稱(也就是Key)來間接訪問對象屬性的方法,這個方法可以不通過getter/setter方法來訪問對象的屬性。用KVC可以間接訪問對象屬性的機制。通常我們使用valueF ...
  • // 註意,在有導航欄的情況下,需要在viewDidLoad 中加上 self.automaticallyAdjustsScrollViewInsets = NO;不然會出現圖片下移64的情況 ,scrollView.frame的高度要比圖片的高度大64,不然,圖片顯示不全 源文件在這裡:http: ...
  • Socket小白篇-附加TCP/UDP簡介 1.Socket 什麼是Socket Socket:又稱作是套接字,網路上的兩個程式通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為Socket。 Socket是對TCP/IP的協議的封裝,Socket本身並不是協議,而是一個調用的介面,只有通過S ...
  • 以下內容為原創,歡迎轉載,轉載請註明 來自天天博客: Android MVP&依賴註入&單元測試 註意 :為了區分 中的 與`Android View MVP View Viewer`來表示。 這裡暫時先只討論 和 ,`Model`暫時不去涉及。 1.1 MVP 基礎框架 1.1.1 前提 首先需要 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...