【iOS开发-96】网络请求总结,深浅拷贝copy和mutableCopy,SDWebImage图像下载第三方框架

(1)一般的网络请求数据的处理结构是这样的

    NSURL *url=[NSURL URLWithString:nil];
    NSURLRequest *request=[NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:5.0f];
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        //处理数据

        //更新主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            //赋值给数据arr=arrM
        });
    }];

当然,我们有时候需要缓存一些数据到本地的话,可以这样操作,把数据写到沙盒的cache中,不能写到Document中,会被苹果商店拒绝的:

NSURL *url=[NSURL URLWithString:nil];
    NSURLRequest *request=[NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:5.0f];
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        //处理数据
        //方法之一,是把数据写入沙盒,相当于离线数据(官方规定除APP之外产生的文件都不能放在Document中,需放在cache中)
        NSString *cache=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        NSString *path=[cache stringByAppendingPathComponent:@"friends.plist"];
        [data writeToFile:path atomically:YES];
        //然后处理数据
        NSArray *dictArr=[NSArray arrayWithContentsOfFile:path];
        NSMutableArray *arrM=[NSMutableArray array];
        for (NSDictionary *dict in dictArr) {
            //字典转模型的语句
            [arrM addObject:nil];
        }
        //更新主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            //赋值给数据arr=arrM
        });
    }];

(2)copy和mutableCopy总结

——mutableCopy是深拷贝,一听名字就恨厉害的样子,可以把它想象成不管被复制的对象是可变还是不可变,mutableCopy深拷贝之后都会产生一个新对象当然地址也会有所不同。

——copy是浅拷贝,copy性格比较复杂,它喜欢看人下菜,如果被拷贝的对象是不可变的,那么拷贝后地址不变,对象还是那个唯一的对象;如果被拷贝对象是可变的,那么它就和深拷贝一样了,直接新建了个对象,当然地址也不一样。这是因为经过copy拷贝后得到的变量都是imutable的,所以可以说copy时如果原变量不可变,那么它觉得被自己copy后的变量也是不可变的,那么十分安全,于是就直接浅拷贝了一下,地址还是相同的引用同一个对象(反正都不能修改),而如果原变量是可变的,那么经过copy之后的变量是不可变的,所以一个可变一个不可变如果还用相同地址引用同一个对象显然很危险,所以必须是不同地址的不同对象。当然经过copy之后的变量,尽管被定义为Mutable的,但是它仍然是iMutable的。

-(void)test2{
    NSMutableString *strM=[NSMutableString stringWithString:@"hello"];
    NSMutableString *str1=[strM copy];
    NSLog(@"%@,%@,%p,%p",strM,str1,strM,str1);
    //地址不同
}

-(void)test3{
    NSString *[email protected]"hello";
    NSMutableString *str1=[strM copy];
    NSLog(@"%@,%@,%p,%p",strM,str1,strM,str1);
    //地址相同
}

-(void)test4{
    NSString *[email protected]"hello";
    NSString *str1=[strM copy];
    NSLog(@"%@,%@,%p,%p",strM,str1,strM,str1);
    //地址相同
}

-(void)test5{
    NSMutableString *strM=[NSMutableString stringWithString:@"hello"];
    NSString *str1=[strM mutableCopy];
    NSLog(@"%@,%@,%p,%p",strM,str1,strM,str1);
    //地址不同
}

-(void)test6{
    NSMutableString *strM=[NSMutableString stringWithString:@"hello"];
    NSMutableString *str1=[strM mutableCopy];
    NSLog(@"%@,%@,%p,%p",strM,str1,strM,str1);
    //地址不同
}

-(void)test7{
    NSString *[email protected]"hello";
    NSMutableString *str1=[strM mutableCopy];
    NSLog(@"%@,%@,%p,%p",strM,str1,strM,str1);
    //地址不同
}

-(void)test8{
    NSString *[email protected]"hello";
    NSString *str1=[strM mutableCopy];
    NSLog(@"%@,%@,%p,%p",strM,str1,strM,str1);
    //地址不同
}

-(void)test9{
    NSMutableString *strM=[NSMutableString stringWithString:@"hello"];
    NSString *str1=[strM copy];
    NSLog(@"%@,%@,%p,%p",strM,str1,strM,str1);
    //地址不同
}

(3)下载图像

——比如头像,最好是复制给模型里面的变量,这样改变的是模型,如video模型

-(void)loadImg:(NSIndexPath *)indexPath{
    //取得对应模型
    Video *v=self.videoList[indexPath.row]
    [NSURLConnection sendAsynchronousRequest:nil queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        v.image=[UIImage imageWithData:data];
        //刷新表格(局部刷新)
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadRowsAtIndexPath:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
        });
    }];
}
//然后在tableView的数据方法cell的赋值方法中赋值即可,
if(!v.image){
    cell.imageView.image=[UIImage imageNamed:@"default"];
}else{
    cell.imageView.image=v.image;
}

(4)第三方框架来进行图像下载:SDWebImage,下载地址:https://github.com/rs/SDWebImage/

——导入第三方框架后,第一件事情就是CMD+B进行编译,以防部分框架需要依赖其他框架才能运行。一般编译都会出现很多警告,正常。

——大部分人都只用了UIImageView+WebCache这个分类来处理图片

以上(3)中的代码可以修改成,直接在cell赋值方法中,这个方法就是框架提供的方法:

if(v.image){
    cell.imageView.image=v.image;
}else{
    [cell.imageView setImageWithURL:url placeholderImage:self.placeHolderImg options:0 completed:^(UIImage *image,NSError *error,SDImageCacheType cacheType){
        v.image=image;//记得给模型赋值
    }];
}

备注:

(1)继承的子类中,如果需要使用成员变量(_name之类的),需要合成一下,@synthesize name=_name;

时间: 2024-08-28 20:47:37

【iOS开发-96】网络请求总结,深浅拷贝copy和mutableCopy,SDWebImage图像下载第三方框架的相关文章

iOS开发 - AFNetworking网络请求

AFNetworking 什么是AFN 全称是AFNetworking,是对NSURLConnection.NSURLSession的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的github地址 https://github.com/AFNetworking/AFNetworking AFHTTPRequestOperationManager 是AFN中最重要的对象之一 封装了HTTP请求的常见处理 GET\POST请求 解析服务器的响应数据

iOS开发之网络请求(一)ASIHTTPRequest

全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 基于底层的CFNetwork框架,运行效率很高 可惜作者早已停止更新,有一些潜在的BUG无人去解决 很多公司的旧项目里面都残留着它的身影,以前的很多iOS项目都是ASI + SBJson 会不会用ASI,可以算是检验是否为老牌iOS程序员的标准之一 ASI的github地址 https://github.com/pokeb/asi-http-request ASI的使用参考 http://www.cnblogs.com/d

iOS开发之网络请求(基于AFNetworking的再封装)

最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服务器进行交互. 那个我们和服务器怎么交互呢?最简单的方式就是说话呗,但是我们要跟服务器说话必须通过我们彼此能听的懂的话来交流,也就需要制定很多的协议了(http,tcp,udp等,这个有兴趣的朋友可以了解一下网络协议的东西).但是我平常最常使用的还是http协议. http://www.cnblog

Android实际开发之网络请求组件的封装(OkHttp为核心)

趁周末时间撸了两天代码,将OkHttp网络请求框架进行了一次简单封装,对于实际开发非常有用.. 此次封装主要针对我们经常使用的网络请求的步骤进行封装,在已有框架OkHttp的基础上进行实际开发的封装 发送一个网络请求,有以下三个功能模块: 一:request处理 二:OkHttp核心处理 三:callback处理 我们进行网络请求组件的封装也是根据这三大模块进行封装的,下面规划一下这次封装的一个思维导图: 根据以上思维导图,我们第一步,先进行request的封装: 以下是封装的一个CommonR

IOS开发之网络编程(请求数据和断点续传)

IOS开发中网络编程应用场景:JSON数据获取,网络数据的下载. 一:请求JSON数据一般用异步请求的方式,如果用同步请求,则会造成IOS界面的执行过程阻塞,即界面部分在请求数据的过程中必须等待数据加载完毕. JSON数据的获取步骤: 1.设置网络地址的字符串:NSString *URLString = @"http://www.baidu.com"; 2.创建URL:NSURL *URL = [NSURL URLWithString:URLString]; 3.创建请求:NSURLR

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理

iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDataDelegate一起搭配实现文件上传功能.另外,下面使用的文件上传思路是和NSURLConnection中本人之前的随笔<iOS开发之网络编程--使用NSURLConnection实现文件上传>提到的上传思路是一样的,都是要将请求信息拼接起来,然后传入到请求里进行上传.这个拼接过程是必要的,但

IOS开发之网络开发工具

IOS开发之网络开发工具 做移动端开发  经常会涉及到几个模块:1.网络检测   2.网络请求get和post请求  3.文件上传  4.文件下载   5.断点续传 现在将这些一一分享给大家 ,也欢迎大家一起学习和讨论  本例子采用AFNetWorking框架 网络检测: #pragma mark - Reachability Management (iOS 6-7) //网络监听(用于检测网络是否可以链接.此方法最好放于AppDelegate中,可以使程序打开便开始检测网络) - (void)

iOS开发笔记 - 网络篇

计算机网络基础 ??计算机网络是多台独立自主的计算机互联而成的系统的总称,最初建立计算机网络的目的是实现信息传递和资源共享. ??如果说计算机是第二次世界大战的产物,那么计算机网络则是美苏冷战的产物.20世纪60年代初期,美国国防部领导的ARPA提出研究一种崭新的.能够适应现代战争的.生存性很强的通信系统并藉此来应对苏联核攻击的威胁,这个决定促使了分组交换网的诞生,也奠定今天计算机网络的原型,这是计算机网络发展史上第一个里程碑式的事件. ??第二个里程碑式的事件是20世纪80年代初,国际标准化组