ios开发网络学习二:URL转码以及字典转模型框架MJExtension的使用

摘要:
一:url转码,当url中涉及到中文的时候,要考虑转码,用UTF8对中文的url进行转码#import"ViewController.h"@interfaceViewController()@end@implementationViewController#pragmamark----------------------#pragmamarkEvents-(void)touchesBegan:(N

一:url转码,当url中涉及到中文的时候,要考虑转码,用UTF8对中文的url进行转码

#import "ViewController.h"

@interfaceViewController ()

@end

@implementationViewController

#pragma mark ----------------------
#pragma mark Events
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self post];
}

#pragma mark ----------------------
#pragma mark Methods
-(void)get{
    
    NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小码哥&pwd=520it&type=JSON";
    
    NSLog(@"转码前: %@",urlStr);
    
    //中文转码处理
    urlStr =[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    
    NSLog(@"转码后: %@",urlStr);
    
    //1.url
    NSURL *url =[NSURL URLWithString:urlStr];
    
    //http://120.25.226.186:32812/login2?username=%E5%B0%8F%E7%A0%81%E5%93%A5&pwd=520it&type=JSON
NSLog(@"url------%@",url);
    
    //2.urlrequest
    NSURLRequest *request =[NSURLRequest requestWithURL:url];
    
    //3.connect
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError *_Nullable connectionError) {
        
        
        //容错处理
        if(connectionError) {
            NSLog(@"%@",connectionError);
            return;
        }
        //4.解析
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];

}

-(void)post
{
    //观察URL中是否有中文,如果有中文则需要转码
    NSString *urlStr = @"http://120.25.226.186:32812/login2";
    
    //username=小码哥&pwd=520it&type=JSON
    //1.url
    NSURL *url =[NSURL URLWithString:urlStr];
    
    //2.urlrequest
    NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];
    
    //2.1 post
    request.HTTPMethod = @"POST";
    
    //2.2 body
    request.HTTPBody = [@"username=小码哥&pwd=520it&type=JSON"dataUsingEncoding:NSUTF8StringEncoding];
    
    //3.connect
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError *_Nullable connectionError) {
        
        //容错处理
        if(connectionError) {
            NSLog(@"%@",connectionError);
            return;
        }
        //4.解析
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];

}
@end

二:MJExtension的使用

1:字典转模型框架

1)相关框架

a.Mantle 需要继承自MTModel

b.JSONModel 需要继承自JSONModel

c.MJExtension 不需要继承,无代码侵入性

(2)自己设计和选择框架时需要注意的问题

a.侵入性

b.易用性,是否容易上手

c.扩展性,很容易给这个框架增加新的功能

(3):MJExtension的使用

1:字典转模型:

1://file:是读取本地的数据本地的资源包存在NSBundle中,url是获取网络端的数据

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"person" ofType:@"plist"]];

XMGPerson *person = [XMGPerson mj_objectWithKeyValues:dict];

2:当网络数据既有字典又有数组字典的时候:需要在模型中重写:

+ (NSDictionary *)mj_objectClassInArray方法。以下两种方试都可以

+ (NSDictionary *)mj_objectClassInArray

{

// key : 属性名

// value : 类名

return @{

@"dogs" : @"XMGDog",

@"books" : @"XMGBook"

};

// return @{

// @"dogs" : [XMGDog class],

// @"books" : [XMGBook class]

// };

}

3:当需要改变网络返回数据的key值时:如遇到系统关键字id或是description时,需要在模型中重写

+ (NSDictionary *)mj_replacedKeyFromPropertyName

+ (NSDictionary *)mj_replacedKeyFromPropertyName

{

// 属性名-字典key-映射

// key : 属性名

// value : 字典中的key

return @{

@"desc" : @"description",

@"ID" : @"id",

@"name" : @[@"name", @"screenname"],//表示属性name既可以对应name也可以对应screenname,优先查看name的值若是name的值没有,则查看screenname的值

@"info" : @[@"other.info[1].abc",//此种情况的数据情况如图:点语法是为字典的key赋值,[]表示数组中的第几个对象,.abc表示这个对象下的test

@"other.info[0].test",

@"name"]

};

}

ios开发网络学习二:URL转码以及字典转模型框架MJExtension的使用第1张

注意:如果服务器返回的数据最外层是字典,字典中又有字典A,字典A中又有其他字典,数据结构如图:

ios开发网络学习二:URL转码以及字典转模型框架MJExtension的使用第2张

解决办法:1:可以用字典转模型,将other字典再构造一个模型 ,字典转模型 2:还可以在数据model中重写+ (NSDictionary *)mj_replacedKeyFromPropertyName方法,

+ (NSDictionary *)mj_replacedKeyFromPropertyName

{

// 属性名-字典key-映射

// key : 属性名

// value : 字典中的key

return @{

@"desc" : @"description",

@"ID" : @"id",

@"name" : @[@"name", @"screenname"],//表示属性name既可以对应name也可以对应screenname,优先查看name的值若是name的值没有,则查看screenname的值

@"info" : @"other.info"

};

}

4:MJExtension在项目中的应用:一般为了减少MJExtension对项目的侵入性,基本做法都是新建配置类继承NSObject,在配置类中实现+(void)load方法,在此方法中对模型中的字段进行配置

#import "XMGExtensionConfig.h"
#import "XMGUser.h"
#import "XMGBook.h"
#import "XMGDog.h"
#import <MJExtension.h>
#import "XMGOther.h"
#import "XMGPerson.h"

@implementationXMGExtensionConfig

+ (void)load
{
#pragma mark - XMGUser[XMGUser mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
        return@{
                 @"desc" : @"description",
                 //@"ID" : @"id",
                 @"name" : @[@"name", @"screenname"],
                 @"info" : @[@"other.info[1].abc",
                             @"other.info[0].test",
                             @"name"]
                 };
    }];
    
    [XMGUser mj_setupObjectClassInArray:^NSDictionary *{
        return@{
                 @"dogs" : @"XMGDog",
                 @"books" : @"XMGBook"};
    }];
    
#pragma mark - XMGPerson[XMGPerson mj_setupReplacedKeyFromPropertyName121:^NSString *(NSString *propertyName) {
        //if ([propertyName isEqualToString:@"ID"]) return @"id";
        return[propertyName mj_underlineFromCamel];
    }];
    
#pragma mark - XMGBook
//[XMGBook mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
//return @{@"ID" : @"id"};
//}];
    
#pragma mark - XMGDog
//[XMGDog mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
//return @{@"ID" : @"id"};
//}];
[NSObject mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
        return @{@"ID" : @"id"};
    }];
}

@end

注意:1:在配置类中进行数据模型的配置,需要实现+(void)load方法,在此方法内进行配置,不需要导入头文件,因为+(void)load是在类加载进内存就会被调用,而且只会被调用一次,+(void)initialize 是累呗使用的时候调用,也是被调用一次 2:若是向一些参数模型,或是数据模型等含有重复的字段值,1:则可以抽重复的字段值抽成父类,让子类去继承,此时父类也可以提供初始化方法给子类继承,在父类初始化方法中父类可以为一些固定的属性赋值 2:用父类去进行初始化,也就是如上面代码所示,都含有ID的配置,则可以用父类NSObject去配置,因为任何类都是继承自NSObject,则此时子类就相当于配置了ID,它的原理就是oc的对象机制,先优先从子类中寻找,子类要是有此属性,就不再去父类寻找,子类若是没有此属性,则其会去父类中查找。

免责声明:文章转载自《ios开发网络学习二:URL转码以及字典转模型框架MJExtension的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Tomcat配置后提示404的解决办法JSON必知必会【PDF+视频教程】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于ffmpeg不同编码方式转码后的psnr对比

一、测试说明: 源文件:1080psrc.mp4 时长:900秒 源文件信息:Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 2960 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)...

HTTPWatch使用

注意:现在httpwatch也可以集成到火狐浏览器中. 一.介绍 HttpWatch是强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理.消息头发送/接受.字符查询.POST 数据和目录管理功能.报告输出.HttpWatch 是一款能够收集并显示深层信息的软件。它不用代理服务器或一些复杂的网络...

智能客户端(SmartClient)

引文 http://dev.csdn.net/develop/article/16/16270.shtm  智能客户端(SmartClient)     本文主要讨论基于企业环境的客户端应用程序模型,由于本人曾经从事过传统的客户端/服务器两层结构应用程序和基于.net平台的多层结构应用程序的开发,因此本文将着重描述.net平台上的智能客户端应用程序模型,并...

iOS开发-图片高斯模糊效果

http://www.cnblogs.com/xiaofeixiang/p/5129074.html iOS开发的时候有的时候需要将图片设置模糊,或者通过点击下拉方法,去除模糊,一切都是为了应用更受用户欢迎,iOS7之后半透明模糊效果得到大范围使用的比较大,现在也可以看到很多应用局部用到了图片模糊效果,关于图片实现高斯模糊效果有三种方式,CoreImag...

[ligerUI] grid行编辑示例

ligerui grid行编辑示例,具备新增行、删除行功能,可在修改某个cell之后,如果录入错误,可以提醒用户。 <%@ page contentType="text/html; charset=UTF-8" %> <% String path = request.getContextPath(); %> <!DOC...

apache配置虚拟目录和URL重定向

1. 虚拟目录 认识虚拟目录 虚拟目录就是在站点中建立一个链接指向某个物理路径,可用于发布站点主目录以外资源或缩短物理路径 虚拟目录配置命令 a. alias URL-path 物理路径 映射URL到文件系统的特定区域 b. aliasMatch 正则表达式 物理路径 使用正则表达式映射URL到文件系统 c. scriptAlias URL-path 物理...