蓝懿ios技术交流和心得分享16.1.26

// 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); }];

POST

    // 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);
    }];

POST

    // 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解耦

    • 自定义单利类继承Manager
  • 优点: 替换框架只需要求改单利类即可
  • 序列化

  • AFN默认将服务器返回的数据当做JSON处理, 会自动解析
    • manager.responseSerializer = [AFJSONRequestSerializer serializer];
  • 告诉AFN,以XML形式解析服务器返回的数据
    • manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  • 告诉AFN, 不处理服务器返回的数据, 原样返回
    • manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  • 主要用于存储对象状态为另一种通用格式,比如存储为二进制、xml、json等等,把对象转换成这种格式就叫序列化,而反序列化通常是从这种格式转换回来。

  • 使用序列化主要是因为跨平台和对象存储的需求,因为网络上只允许字符串或者二进制格式,而文件需要使用二进制流格式,如果想把一个内存中的对象存储下来就必须使用序列化转换为xml(字符串)、json(字符串)或二进制(流) 

网络状态检测

  • AFN
    // 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(@"没有网络"); }}

  • 图片下载
    • 重复下载问题
      • 定义字典保存下载好的图片

    • 磁盘缓存问题
      • 内存没有尝试从磁盘获取
    • 阻塞主线程问题
      • 新建NSOperationQueue下载图片
    • 重复设置问题
      • reloadRowsAtIndexPaths
    逻辑

    1

    - 从来没下载过 1.查看内存缓存是否有图片 2.查看磁盘缓存是否有图片 3.查看时候有任务正在下载当前图片 4.开启任务下载图片 5.写入磁盘 6.缓存到内存 7.移除下载操作 8.显示图片 逻辑2 - 已经下载过 1.查看内存缓存是否有图片 2.查看磁盘缓存是否有图片 3.使用磁盘缓存 4.将图片缓存到内存中 5.更新UI 逻辑3 - 已经下载过, 并且不是重新启动 1.查看内存缓存是否有图片 2.更新UI

    目录结构:

    • Documents

    • 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度、涂鸦软件的绘图
    • 目录中的文件会被自动保存在 iCloud
    • 注意:不要保存从网络上下载的文件,否则会无法上架!
    • Caches

    • 保存临时文件,"后续需要使用",例如:缓存图片,离线数据(地图数据)
    • 系统不会清理 cache 目录中的文件
    • 就要求程序开发时,"必须提供 cache 目录的清理解决方案"
    • Preferences

    • 用户偏好,使用 NSUserDefault 直接读写!
    • 如果要想数据及时写入磁盘,还需要调用一个同步方法
    • tmp

    • 保存临时文件,"后续不需要使用"
    • tmp 目录中的文件,系统会自动清理
    • 重新启动手机,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]];}

    SDWebImage架构

    • SDWebImageManager

    • SDImageCache
    • SDWebImageDownloader
      • SDWebImageDownloaderOperation
    • SDWebImage常见面试题

    • 默认缓存时间多少

    • 一周
    • 缓存的地址

    • NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns];
    • cleanDisk如何清理过期图片

    • 删除早于过期日期的文件
    • 保存文件属性以计算磁盘缓存占用空间
    • 如果剩余磁盘缓存空间超出最大限额,再次执行清理操作,删除最早的文件
    • clearDisk如何清理磁盘

    • 删除缓存目录
    • 新建缓存目录
    • SDWebImage如何播放图片

    • 取出gif中每一帧, 生成一张可动画图片
    • SDWebImage如何判断图片类型

    • 判断图片二进制前8个字节
    • kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};

    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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值