现在的学习基本脱离了那几本教程,
上个礼拜正式着手代码编写。
同事UI弄得比较快,于是我只好写写网络通信,数据源模型设计以及加解密。
这边简单的说下常用的第三方网络库以及,以及json数据协议格式的简单使用。
先引入目前网上点击率最高的关于这个使用的文章(源文不详,呵呵)
我只是简单说下一般项目中会用到的最基础一部分,有的东西都是用着用着就熟了,犯不着一开始记住那么多,然后没有实践都会慢慢忘掉,
我比较喜欢先简单看下,在头脑中形成一个类似于一个索引目录,不知道细节没关系,我们有了索引就可以去查阅资料嘛。
先准备下ASIHttpRequest的一些下载和添加。
1.下载地址,我是在github上下的,地址https://github.com/pokeb/asi-http-request/
2.然后吧源文件拖进去项目,添加:CFNetwork.framework,.framework, MobileCoreServices.framework,CoreGraphics.framework和libz.1.2.3.dylib。上面文章都有介绍。
然后我们简单看下一个最简单的异步请求。
包含一个url地址,一个request,一个delegate。
@implementation NLNetHelper
+ (void)startRequesWithContent:(NSObject *)model delegte :delegte
{
//step 1: 根据code判断是佛要3des加密
NSString *code = [model getMethidCode];
NSLog(@"code是!!!!!!%@",code);
if (code == @"10000") {
}
//step 2:head和body组装成jsonString
NLHead *head = [[NLHead alloc] init];
// head
// NSString *urlString = [NSString stringWithFormat:@"%@%@.do",baseURL,code];
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setPostBody:nil];
[request setDelegate:delegte];
[request startAsynchronous];
//step1. 模型解析
}
代码直接项目中测试类拷贝的,主要看下面的4-5句。
因为在Android编写习惯性会把我们自己的网络处理类封装在一起。
但是ios中看了很多demo,发现请求参数处理以及request以及response返回的处理都在ViewController中处理~
一眼看上去是方便多了,不用定义一些类似于bean类型的类来管理我们要设置进去一些属性值,用于最后转化成请求参数在网络层处理,
而是很直接的手动拼装起来。
因为这第一个项目,也不知道ios有木有这样的习惯,就是ViewController类中基本处理了当前页面的所有逻辑操作~因为看过一个我们外包版本的项目
一个ViewController代码2,3千行~~
好了,我的意思是有需要的可以自己书写一个netManager,parseHelper等等的类。
在Android中异步的操作一般子线程然后handler来处理。
ios暂时没接触多线程这块。异步的请求,对于返回以及何时返回,返回错误,用了代理这方法。
因为我们都知道异步的这个概念,直白点就是,MainThread新起一个SubThread,子线程处理完东西后,一是用所谓的Handler神马的机制来通知主线程,
或者是经典的的回调函数嘛。而代理类,协议啊接口,正式有部分这样的性质不是么?
@optional
// These are the default delegate methods for request status
// You can use different ones by setting didStartSelector / didFinishSelector / didFailSelector
- (void)requestStarted:(ASIHTTPRequest *)request;
- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;
- (void)request:(ASIHTTPRequest *)request willRedirectToURL:(NSURL *)newURL;
- (void)requestFinished:(ASIHTTPRequest *)request;
- (void)requestFailed:(ASIHTTPRequest *)request;
- (void)requestRedirected:(ASIHTTPRequest *)request;
// When a delegate implements this method, it is expected to process all incoming data itself
// This means that responseData / responseString / downloadDestinationPath etc are ignored
// You can have the request call a different method by setting didReceiveDataSelector
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
// If a delegate implements one of these, it will be asked to supply credentials when none are available
// The delegate can then either restart the request ([request retryUsingSuppliedCredentials]) once credentials have been set
// or cancel it ([request cancelAuthentication])
- (void)authenticationNeededForRequest:(ASIHTTPRequest *)request;
- (void)proxyAuthenticationNeededForRequest:(ASIHTTPRequest *)request;
以上就是所有的可选的带了方法,看意思就明白。
好了,以上只是ASIHttpRequest中部分的功能,基本就能解决我们一般网络类应用中大部分的功能了吧。
二:SBJson使用
虽然现在看到说sdk5.0以上,已经集成了json解析库。同时貌似说性能还高,但是,可能我们的现在的应用还要兼容下5.0以下的版本。
反正这些都是需要我们客观看待然后主观舍取。
SBJSon同样的一个第三方包
1.下载地址https://github.com/stig/json-framework
我们都知道,json的格式就是key value。
说白了json格式就是一种带着特性的String字窜。
我们把我们要的数据组装成这样的字窜床底给服务端,然后服务端返回同样这样字窜的数据,我们要解析然后提取出内容来。
看过java我们都知道,其实里面是map的遍历。
同样的,在ios,我们需要先定义一个字典,然后把需要传递的数据以键值对存入,然后调用json解析器生成jsonString。
同样,也会有个反序列化咯。
[dictionary JSONRepresentation]; 字典生成jsonString。
NSMutableDictionary *dic = [jsonString JSONValue]; jsonString转化成字典
其实相对于ios上的,java中其实封装的更加完美。能直接操作javabean-》jsonString。
因为用了反射,后来查了下,貌似ios也是有反射这内容啊~
为什么说bean—>jsonString呢。
因为,大部分,比如我们一个用户登陆通信,我们会设计一个LoginBean,包含两个字段 username和password,然后是setter,getter方法。
当然,不用bean,直接在ViewCotroller中把name啊password设置如dic中,因为我看了几个demo版本都这样~,甚至我们外包的那个项目也是这么搞。
好了,反正简单来说。
数据转化,如果使用了类似于bean的自定义类,那么bean—》dic—>jsonString。反解析时同样。
因此我的处理是:
-(NSString *)bean2jsonString{
NSMutableDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
partnerCode, @"partnerCode",
version, @"version",
prov,@"prov",
mobile,@"moblie",
methodId,@"methodId",
userId,@"useId",
[NSDictionary dictionaryWithObjectsAndKeys:postTime, @"postTime",md5Sign,@"md5Sign",nil],@"other",
nil];
return [dictionary JSONRepresentation];
}
- (void)jsonString2Bean:(NSString *)jsonString
{
NSMutableDictionary *dic = [jsonString JSONValue];
NSString *partnerCodeString = [NSString stringWithFormat:@"修改过的%@",[dic objectForKey:@"partnerCode"]];
[self setPartnerCode:partnerCodeString];
}
该方法是在bean中。反正觉得没有Android中json用起来方便,你扔个标准bean对象,就给你出来一个jsonString。
其实也是很简单的两块内容,刚做了,记录下。下面准备调通下加密这块,分享和借鉴