iOS開發--網路下載

來源:互聯網
上載者:User

標籤:

這裡使用的是NSURLConnection的代理請求下載,並且是具有進度,UI能即時重新整理,至於NSURLConnection如何請求、並且有幾種要求方法請看NSURLConnection請求簡介,在這裡的話我們以下載一本書籍為例,下面為它的地址(這是在百度雲裡面弄的,連結是別人加密了,所有比較長)

http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804

代碼:

1、首先在storyboard裡面拖入一個Progress View(進度條)控制項2、在控制器中拖入Progress View屬性,並且另外添加三個屬性,如下:    @interface ViewController ()<NSURLConnectionDelegate>    /** 進度條屬性*/    @property (weak, nonatomic) IBOutlet UIProgressView *progressView;    /** 檔案總大小 */    @property (nonatomic, assign) NSUInteger totalLength;    /** 檔案當前大小 */    @property (nonatomic, assign) NSUInteger currentLength;    /** 檔案路徑 */    @property (nonatomic, copy) NSString *path;    @end3、確定它的URL,以及請求,並且設定它的代理,然後發送所謂的代理請求    - (void)viewDidLoad {        [super viewDidLoad];        //1、確定URL        NSURL *url = [NSURL URLWithString:@"http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804"];        //2、建立請求對象        NSURLRequest *request = [NSURLRequest requestWithURL:url];        //3、代理請求        /*         第一個參數:請求對象         第二個參數:誰成為代理         第三個參數:startImmediately :是否立即開始發送網路請求         */        NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];        [connection start];    }4、在這個Demo中,代理有兩個方法是很重要的    4.1、第一個就是剛開始響應的時候,在回應標頭中,我可以擷取檔案的預估大小和檔案名稱尾碼,用來建立檔案夾和記錄檔案的總大小,用於後面的計算    4.2、第二個就是每次接受到伺服器資料的時候,我可以往某個檔案寫資料,以及計算每次佔比例的多少    //1.當接受到伺服器響應的時候會調用:response(回應標頭)    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response    {        NSLog(@"接受到響應");        //1、在回應標頭中有一個預估的檔案大小expectedContentLength        self.totalLength = response.expectedContentLength;        //這裡你們可以列印看看   然後在網頁的要求標頭也可以去對比一下,看是否為一樣        //    NSLog(@"totalLength = %lld", response.expectedContentLength);        //2、這裡的話為了讓效能好一點,我直接在沙箱的Caches中建立一個檔案夾直接寫的硬碟上,而不是記憶體中        //2.1、這裡是地址為   在沙箱路徑的Caches中  添加一個檔案名稱為suggestedFilename的檔案,suggestedFilename是回應標頭中的,也是百度雲弄的名字你們也可以列印看看        //    NSLog(@"%@",response.suggestedFilename);        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingString:response.suggestedFilename];        //2.2、拿到地址那我們開始建立一個空得檔案夾,並且路徑給外面的path屬性,用於後面拿到位置下載        NSFileManager *manager = [NSFileManager defaultManager];        [manager createFileAtPath:path contents:nil attributes:nil];        self.path = path;    }    //2.當接受到伺服器返回資料的時候調用(會調用多次)    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data    {        // 1、建立一個操作檔案的控制代碼,並且給予上次的建立檔案夾的地址。        NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path];        //設定寫入方式,自上次後面寫入        [handle seekToEndOfFile];        // 2、利用控制代碼往檔案中寫入資料        [handle writeData:data];        // 3、計算當前接收到得資料的總數  這裡就是記錄每一次寫入資料的多少        self.currentLength += data.length;        // 4、計算下載比例        self.progressView.progress = 1.0 * self.currentLength/self.totalLength;    }    //3.當請求失敗的時候調用    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error    {        NSLog(@"請求失敗");    }    //4.當請求結束(成功|失敗)的時候調用    -(void)connectionDidFinishLoading:(NSURLConnection *)connection    {        NSLog(@"請求結束");    }

補充

在這個Demo中唯一的優點就是節約了記憶體,因為每一次寫都寫到了硬碟中去,而不是記憶體中,現在你們可以開啟你們自己的沙箱裡面應該會有一個PDF的檔案也就是剛剛下載的,這個Demo中最重要的方法為:

//1.當接受到伺服器響應的時候會調用:response(回應標頭)-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{} //2.當接受到伺服器返回資料的時候調用(會調用多次)-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{}

結束

 

iOS開發--網路下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.