// 1.创建AFN管理者 // AFHTTPRequestOperationManager内部包装了NSURLConnection AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.利用AFN管理者发送请求NSDictionary *params = @{ @"username" : @"520it", @"pwd" : @"520it" }; [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { // 注意点: 如果服务器返回的是JSON, AFN会自动转换为OC对象 NSLog(@"请求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) {NSLog(@"请求失败---%@", error); }];
// 1.创建AFN管理者
// AFHTTPRequestOperationManager内部包装了NSURLConnection
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2.利用AFN管理者发送请求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
};
[manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
```##NSURLSession包装方法###GET```objc
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者发送请求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
};
[manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者发送请求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
};
[manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者发送请求
NSURLRequest *reuqest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];
[[manager downloadTaskWithRequest:reuqest progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// targetPath: 已经下载好的文件路径
NSLog(@"targetPath = %@", targetPath);
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[path stringByAppendingPathComponent:response.suggestedFilename]];
// 返回需要保存文件的目标路径
return documentsDirectoryPath;
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"filePath = %@", filePath);
}] resume];
要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!// 下载时监听进度- (void)download2{
// 1. 创建AFNetworking管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2. 利用AFNetworking管理者发送请求
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];
// 3.创建NSProgress
NSProgress *progress = nil;
self.progress = progress;
// 4. 创建下载任务
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// 文件移动到caches目录
NSString *path = [response.suggestedFilename cacheDir];
// 获取文件的URL地址
NSURL *destURL = [NSURL fileURLWithPath:path];
// 返回URL地址
return destURL;
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"filePath = %@", filePath);
}];
// 5. 给NSProgress注册监听, 监听它的completedUnitCount属性的改变
/* NSProsess属性: @property int64_t totalUnitCount; 总大小 @property int64_t completedUnitCount; 完成大小 */
[progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
[task resume];}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([object isKindOfClass:[NSProgress class]]) {
NSProgress *progress = (NSProgress *)object;
// 计算下载进度
NSLog(@"%f", 1.0 * progress.completedUnitCount / progress.totalUnitCount);
}}- (void)dealloc{
[self removeObserver:self.progress forKeyPath:@"completedUnitCount"];}
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者发送请求
[manager POST:@"http://120.25.226.186:32812/upload" parameters:@{@"username" : @"lnj"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
NSData *data = [NSData dataWithContentsOfFile:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"];
// name : 服务器对应的数据参数
[formData appendPartWithFileData:data name:@"file" fileName:@"lnj.png" mimeType:@"image/png"];
} success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"] name:@"file" fileName:@"lnj.png" mimeType:@"image/png" error:nil];
最好用
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"] name:@"file" error:nil];
AFN解耦
序列化
主要用于存储对象状态为另一种通用格式,比如存储为二进制、xml、json等等,把对象转换成这种格式就叫序列化,而反序列化通常是从这种格式转换回来。
使用序列化主要是因为跨平台和对象存储的需求,因为网络上只允许字符串或者二进制格式,而文件需要使用二进制流格式,如果想把一个内存中的对象存储下来就必须使用序列化转换为xml(字符串)、json(字符串)或二进制(流)
// 1.创建网络监听对象
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; // 2.设置网络状态改变回调 [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { /*AFNetworkReachabilityStatusUnknown = -1, // 未知AFNetworkReachabilityStatusNotReachable = 0, // 无连接AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花钱AFNetworkReachabilityStatusReachableViaWiFi = 2, // 局域网络,不花钱 */ switch (status) { case 0: NSLog(@"无连接"); break; case 1: NSLog(@"3G 花钱"); break; case 2: NSLog(@"局域网络,不花钱"); break; default: NSLog(@"未知"); break; } }]; // 3.开始监听 [manager startMonitoring];
-
(void)viewDidLoad { [super viewDidLoad]; // 注册通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNetworkStatus) name:kReachabilityChangedNotification object:nil]; // 开始监听网络self.reachability = [Reachability reachabilityForInternetConnection];[self.reachability startNotifier];}- (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; [self.reachability stopNotifier];}- (void)getNetworkStatus{ if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus != NotReachable) {NSLog(@"wifi"); }else if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus != NotReachable) { NSLog(@"手机自带网络"); }else { NSLog(@"没有网络"); }}
图片下载
逻辑
1
- 从来没下载过 1.查看内存缓存是否有图片 2.查看磁盘缓存是否有图片 3.查看时候有任务正在下载当前图片 4.开启任务下载图片 5.写入磁盘 6.缓存到内存 7.移除下载操作 8.显示图片 逻辑2 - 已经下载过 1.查看内存缓存是否有图片 2.查看磁盘缓存是否有图片 3.使用磁盘缓存 4.将图片缓存到内存中 5.更新UI 逻辑3 - 已经下载过, 并且不是重新启动 1.查看内存缓存是否有图片 2.更新UI
目录结构:
Documents
Caches
Preferences
tmp
封装获取文件路径方法
// cache
-
(NSString *)cacheDir{ // 1.获取cache目录 NSString *dir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; return [dir stringByAppendingPathComponent:[self lastPathComponent]];}// document- (NSString *)documentDir { NSString *dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; return [dir stringByAppendingPathComponent:[self lastPathComponent]];}// tmp- (NSString *)tmpDir { NSString *dir = NSTemporaryDirectory(); return [dir stringByAppendingPathComponent:[self lastPathComponent]];}
SDWebImageManager
SDWebImage常见面试题
默认缓存时间多少
缓存的地址
cleanDisk如何清理过期图片
clearDisk如何清理磁盘
SDWebImage如何播放图片
SDWebImage如何判断图片类型
SDWebImage常用方法:
//图片缓存的基本代码,就是这么简单
[
self
.
image1
sd_setImageWithURL:imagePath1];//用block 可以在图片加载完成之后做些事情[self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { NSLog(@"这里可以在图片加载完成之后做些事情");}];//给一张默认图片,先使用默认图片,当图片加载完成后再替换[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];//使用默认图片,而且用block 在完成后做一些事情[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { NSLog(@"图片加载完成后做的事情");}];//options 选择方式[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];// 直接下载一张图片 /* 第1个参数: 需要下载图片的URL 第2个参数: 下载的配置信息(例如是否需要缓存等等) 第3个参数: 下载过程中的回调 第4个参数: 下载完成后的回调 */ NSURL *url = [NSURL URLWithString:@"http://ia.topit.me/a/f9/0a/1101078939e960af9ao.jpg"];[[SDWebImageManager sharedManager] downloadImageWithURL:url options:kNilOptions progress:^(NSInteger receivedSize, NSInteger expectedSize) {// receivedSize : 已经接受到的数据大小 // expectedSize : 需要下载的图片的总大小NSLog(@"正在下载 %zd %zd", receivedSize, expectedSize); } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { // image : 下载好的图片 // error: 错误信息 // cacheType: 缓存的类型 // finished: 是否下载完成 // imageURL: 被下载的图片的地址 NSLog(@"下载成功 %@", image); }];
学习ios 重要还是要理清楚思路 在做或者看老师代码的时候 自己多想想为什么 不要自己看着就抄 另外还是要推荐一下 蓝懿IOS这个培训机构 和刘国斌老师刘国斌老师还是很有名气的,听朋友说刘老师成立了蓝懿iOS,,老师讲课方式很独特,能够尽量让每个人都能弄明白,有的比较难懂的地方,如果有的地方还是不懂得话,老师会换个其它方法再讲解,这对于我们这些学习iOS的同学是非常好的,多种方式的讲解会理解得更全面,这个必须得给个赞,嘻嘻,还有就是这里的学习环境很好,很安静,可以很安心的学习,安静的环境是学习的基础,小班讲课,每个班20几个学生,学习氛围非常好,每天都学到9点多才离开教室,练习的时间很充裕,而且如果在练习的过程中有什么困难,随时可以向老师求助,不像其它机构,通过视频教学,有的甚至学完之后都看不到讲师本人,问点问题都不方便,这就是蓝懿与其它机构的区别,相信在刘国斌老师的细心指导下,每个蓝懿学员都能找到满意的工作,加油!
写博客第一百零八天;
QQ:565803433