`
mmdev
  • 浏览: 12846091 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

IOS学习十四:网络之ASIHttpRequest和SBJson简单使用

 
阅读更多

现在的学习基本脱离了那几本教程,

上个礼拜正式着手代码编写。

同事UI弄得比较快,于是我只好写写网络通信,数据源模型设计以及加解密。

这边简单的说下常用的第三方网络库以及,以及json数据协议格式的简单使用。


先引入目前网上点击率最高的关于这个使用的文章(源文不详,呵呵)

ASIHTTPRequest类库简介和使用说明


我只是简单说下一般项目中会用到的最基础一部分,有的东西都是用着用着就熟了,犯不着一开始记住那么多,然后没有实践都会慢慢忘掉,

我比较喜欢先简单看下,在头脑中形成一个类似于一个索引目录,不知道细节没关系,我们有了索引就可以去查阅资料嘛。


先准备下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。

其实也是很简单的两块内容,刚做了,记录下。下面准备调通下加密这块,分享和借鉴


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics