程序的实现需要借助几个对象:

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(, , , )];
//加圆角和边框
_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(, , , )];
[self.view addSubview:_progressView];
//状态显示
_label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];
_label.textColor = [UIColor colorWithRed: green:/255.0 blue:1.0 alpha:1.0];
[self.view addSubview:_label];
//下载按钮
_button = [[UIButton alloc]initWithFrame:CGRectMake(, , , )];
[_button setTitle:@"下载" forState:UIControlStateNormal];
[_button setTitleColor:[UIColor colorWithRed: green:/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 = ;
//通过响应头中的 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

随笔 10()部分,都来自 KenshinCui,后系列就不一一列出,估计大神的 url 没用了,所以我换了个音乐的 url,可以用。初学者,若有错误,敬请指出,不甚感激。

iOS 学习 - 10下载(1) NSURLConnection 篇的更多相关文章

  1. iOS 学习 - 10下载(4) NSURLSession 会话 篇

    NSURLConnection通过全局状态来管理cookies.认证信息等公共资源,这样如果遇到两个连接需要使用不同的资源配置情况时就无法解决了,但是这个问题在NSURLSession中得到了解决.N ...

  2. iOS 学习 - 10下载(3) NSURLSession 音乐 篇

    使用 NSURLSession 下载,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中 // // ViewController.m // Web ...

  3. iOS 学习 - 10下载(2) NSURLSession 图片 篇

    使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // V ...

  4. ios学习- 10大iOS开发者最喜爱的类库

    该10大iOS开发者最喜爱的库由“iOS辅导团队”成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个最好的库: 1)不能 ...

  5. iOS学习10之OC类和对象

    本次是OC的第一节课,主要是学习和理解类与对象 1.面向对象 1> OOP(Object Oriented Programming)面向对象编程. 面向对象以事物为中心,完成某件事情都需要哪些事 ...

  6. iOS学习笔记之异步图片下载

    写在前面 在iOS开发中,无论是在UITableView还是在UICollectionView中,通过网络获取图片设置到cell上是较为常见的需求.尽管有很多现存的第三方库可以将下载和缓存功能都封装好 ...

  7. [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件

    nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...

  8. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  9. iOS学习资料整理

    视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS S ...

随机推荐

  1. 30天C#基础巩固------读写流(StreamWrite/StreamReader)

    一:读写流的一些案例. --->关于StreamWrite       这里的一些常用的方法和我们之前的那个FileStream是一样的,参数很多都是一样的用法. Console.WriteLi ...

  2. 在IIS服务器上部署svg/woff/woff2字体

    在url没错的前提下,字体文件报404错误,如.woff,.woff2 出错原因: IIS不认SVG,WOFF/WOFF2这几个文件类型 解决方案: 在IIS服务器上部署svg/woff/woff2字 ...

  3. mvc url 伪静态

    WebConfig配置 <system.webServer> <validation validateIntegratedModeConfiguration="false& ...

  4. 简单横道图Demo

    代码(每个月都显示整月): @{ ViewBag.Title = "横道图"; Layout = "~/Views/Shared/_Layout.cshtml" ...

  5. Mailbox unavailable. The server response was: 5.1.1 User unknown

    昨晚至今早,在新的项目中,实现一个小功能,就是当有访问者浏览网页在留言簿留言时,系统把留言内容发送至某一个邮箱或是抄送指定的邮箱中. 使用以前能正常发送邮件的代码,但在新项目中,测试时,就是出现标题的 ...

  6. svn无法创建分支的解决方法

    创建分支时出现错误 Access to '/svn/project01/!svn/rvr/18022/trunk' forbidden 解决方法: 找到project01仓库的根目录,假如在d:\sv ...

  7. SignalR入门之多平台SignalR服务端

    之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP. ...

  8. linux_shell_5_shell特性_正则_1

    前面我们了解了部分linux shell的相关特性,下面的链接是第4篇文章:linux_shell_4_shell特性 这里我们来继续讨论linux shell中至关重要的一个特性: 正则表达式 (r ...

  9. Java--如何使用sun.misc.Unsafe完成compareAndSwapObject原子操作

    package com; import sun.misc.Unsafe; import java.lang.reflect.Field; /** * Created by yangyu on 16/1 ...

  10. FHS定义的Linux目录树

    根目录/: 最重要的一个目录,与开机/修复/还原有关.该目录所在的分区越小越好,安装的程序也最好不要放在该分区内. 根目录下必须存在的子目录: 目录 说明 /bin 存放了很多常用命令,能被root和 ...