• ASIHTTPRequest系列(一):同步和异步请求


    ASIHTTPRequest系列(一):同步和异步请求

    发表于8个月前(2013-11-27 19:21)   阅读(431) | 评论(0) 6人收藏此文章, 我要收藏
    0

    ASIHTTPRequest提供如下功能:
    1、提交数据到web服务器或者从web服务器获得数据;
    2、下载数据到内存或磁盘;
    3、采用html input相同的机制上传文件;
    4、断点续传;
    5、简单存取HTTP头;
    6、上传/下载进度显示;
    7、支持Cookie;
    8、后台运行(iOS4.0以上支持);
    9、对于请求和响应的GZIP支持;
    10、支持客户端证书;
    11、支持同步/异步请求;
    ......

        关于它的介绍网上已经有很多了,该项目有很详细的指南文档:How to use ASIHTTPRequest,也有网友翻译成中文了。本文没有完全照搬官方文档的内容,而是着重介绍了几个常见的应用,并涵盖了一些自己的理解和实际应用经验,包括:
    安装、简单异步/同步请求、队列请求、上传、下载及 Cookies
        注意,虽然这些技术在本文中是分开讲述的,但在实际工作中,往往是多种技术结合应用的。
        此外,Http请求往往伴随着XML技术的应用,实际上ASIHTTPRequest是可以和SAX异步解析结合应用的,这部分内容请参考ASIHTTPRequest和libxml结合,实现边请求边解析》

        项目下载地址: http://github.com/pokeb/asi-http-request/tarball/master 
        解压缩并打开文件夹,其中包括:
            1、一个iPhone Xcode项目(源文件)
            2、一个Mac Xcode项目(源文件)
            3、一个iPhone下使用的Sample Code(源文件)
            4、一个Mac下使用的Sample Code(源文件)
            5、一个Readme.texttile,关于该项目的介绍
        其实所有的内容都在其中了,如果你是初学者,不知到怎么下手,可以看 http://allseeing-i.com/ASIHTTPRequest/How-to-use这里有一份详细的入门指南。
        现在,我们要做的就是,在自己的项目中使用它。

    一、在项目中使用ASIHTTPRequest
    1、拷贝源文件到项目中
        ASIHTTPRequest是一个开源项目,要使用它,直接拷贝项目源文件到你的项目中,包括下列文件(即Classes下所有文件和External/Reachability下所有文件):
    ASIHTTPRequestConfig.h
    ASIHTTPRequestDelegate.h
    ASIProgressDelegate.h
    ASICacheDelegate.h
    ASIHTTPRequest.h
    ASIHTTPRequest.m
    ASIDataCompressor.h
    ASIDataCompressor.m
    ASIDataDecompressor.h
    ASIDataDecompressor.m
    ASIFormDataRequest.h
    ASIInputStream.h
    ASIInputStream.m
    ASIFormDataRequest.m
    ASINetworkQueue.h
    ASINetworkQueue.m
    ASIDownloadCache.h
    ASIDownloadCache.m
        对于 iPhone,还要拷贝下列文件:
    ASIAuthenticationDialog.h
    ASIAuthenticationDialog.m
    Reachability.h (External/Reachability目录)
    Reachability.m(External/Reachability目录)

    2、添加依赖库

        ASIHTTPRequest依赖于以下5个框架或库:
    CFNetwork、SystemConfiguration、MobileCoreServices、CoreGraphics和libz1.2.3。
    依次将上述库和框架添加到target的Linked Libraries中。

    二、简单的同步请求示例
        新建iOS项目,加入必需的源文件和Linked Libraries。往MainWindow.xib中添加一个UIButton,添加相应的outlet与action。编写按钮的Touch up inside代码,并连接到UIButton:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    - (IBAction)goURL {
        NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
         
        // 构造ASIHTTPRequest对象
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
         
        // 开始同步请求
        [request startSynchronous];
        NSError *erro = [request error];
        assert(!erro);
         
        // 如果请求成功,返回Response
        NSString *response = [request responseString];
        NSLog(@"%@", response);
    }

        别忘了在适当的地方导入ASIHTTPRequest:#import "ASIHTTPRequest.h"分别保存IB和Xcode中所做的更改,⌘+B编译。

    三、简单的异步请求示例
    将上述代码修改为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    - (IBAction)goURL {
        NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
         
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
         
        // 设定委托,委托自己实现异步请求方法
        [request setDelegate: self];
         
        // 开始异步请求
        [request startAsynchronous];
    }
    并 实现一系列委托方法:(别忘了在.h中添加import头文件以及delegate) 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    - (IBAction)goURL
    {
        NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
        __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
         
        // ASIHTTPRequest支持iOS4.0的块语法,可以把委托方法定义到块中
        [request setCompletionBlock:^{
            // 请求响应结束,返回response
            NSString *response = [request responseString];
            // 对于2进制数据,使用:NSData *response = [request responseData];
            NSLog(@"%@", response);
        }];
         
        [request setFailedBlock:^{
            // 请求失败,获取error
            NSError *error = [request error];
            NSLog(@"%@", [error userInfo]);
        }];
         
        [request startAsynchronous];
    }

        但此时出现了郁闷的一幕,代码块中的request对象出现警告信息:Capturing 'request' strongly in this block is likely to lead to a retain cycle。看到这个我就知道麻烦了,然后我查了一些资料,但没有很好的解决这个问题,大家可以参考一下这里 Block的Retain Cycle的解决方法 。要是有谁知道麻烦说一下,大家相互学习。

    参考文章:http://blog.csdn.net/kmyhy/article/details/6524893

    转:http://my.oschina.net/iNiL0119/blog/179526

  • 相关阅读:
    Hadoop配置
    大数据总览
    Shell(五)Shell输入/输出重定向
    善用try catch来使不可避免的错误发生时,程序不崩溃,只是终止该进程。
    silverlight 程序发布
    linq查distinct
    silverlight 服务端与客户端分2个VS程序打开,同时调试
    将25转成00025的方法
    【转】C#导出数据到EXCEL方法谈(附实例源码和超级无敌详细讲解)
    LINQ处理List数据
  • 原文地址:https://www.cnblogs.com/ygm900/p/3907773.html
Copyright © 2020-2023  润新知