zoukankan      html  css  js  c++  java
  • ASIHTTPRequest 详解, http 请求终结者

    创建一个异步请求
    异步请求的好处是不阻塞当前线程,但相对于同步请求略为复杂,至少要添加两个回调方法来获取异步事件。
    下面异步请求代码完成上面同样的一件事情:

     
    复制代码
    1. - (IBAction)grabURLInBackground:(id)sender
    2. {
    3.    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
    4.    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    5.    [request setDelegate:self];
    6.    [request startAsynchronous];
    7. }
    8.  
    9. - (void)requestFinished:(ASIHTTPRequest *)request
    10. {
    11.    // Use when fetching text data
    12.    NSString *responseString = [request responseString];
    13.  
    14.    // Use when fetching binary data
    15.    NSData *responseData = [request responseData];
    16. }
    17.  
    18. - (void)requestFailed:(ASIHTTPRequest *)request
    19. {
    20.    NSError *error = [request error];
    21. }



    a,与上面不同的地方是指定了一个 "delegate",并用startAsynchronous来启动网络请求。
    b,在这里实现了两个delegate的方法,当数据请求成功时会调用requestFinished,请求失败时(如网络问题服务器内部错误)会调用requestFailed。


    队列请求
    提供了一个对异步请求更加精准丰富的控制。
    如,可以设置在队列中,同步请求的连接数。往队列里添加的请求实例数大于maxConcurrentOperationCount时,请求实例将被置为等待,直到前面至少有一个请求完成并出列才被放到队列里执行。
    也适用于当我们有多个请求需求按顺序执行的时候(可能是业务上的需要,也可能是软件上的调优),仅仅需要把maxConcurrentOperationCount设为“1”。

     
    复制代码
    1. - (IBAction)grabURLInTheBackground:(id)sender
    2. {
    3.    if (![self queue]) {
    4.       [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
    5.    }
    6.  
    7.    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
    8.    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    9.    [request setDelegate:self];
    10.    [request setDidFinishSelector:@selector(requestDone:)];
    11.    [request setDidFailSelector:@selector(requestWentWrong:)];
    12.    [[self queue] addOperation:request]; //queue is an NSOperationQueue
    13. }
    14.  
    15. - (void)requestDone:(ASIHTTPRequest *)request
    16. {
    17.    NSString *response = [request responseString];
    18. }
    19.  
    20. - (void)requestWentWrong:(ASIHTTPRequest *)request
    21. {
    22.    NSError *error = [request error];
    23. }



    创建NSOperationQueue,这个Cocoa架构的执行任务(NSOperation)的任务队列。我们通过ASIHTTPRequest.h的源码可以看到,此类本身就是一个NSOperation的子类。也就是说它可以直接被放到"任务队列"中,并被执行。上面的代码队了队列的创建与添加操作外,其它代码与上一例一样。

    队列异步请求中中获取或识别不同request小技巧
    a,可以设置一个上下文(userInfo)到request对象中,当请求响应完后可以通过访问request对象的userInfo获取里面的信息
    b,为每一个请求实例设置不同的setDidFinishSelector / setDidFailSelector的回调方法
    c,子类化ASIHTTPRequest,重写requestFinished: 与 failWithProblem:方法

    ASINetworkQueues, 它的delegate提供更为丰富的功能
    提供的更多的回调方法如下:
    a,requestDidStartSelector,请求发起时会调此方法,你可以在此方法中跟据业务选择性的设置request对象的deleaget。
    b,requestDidReceiveResponseHeadersSelector,当接受完响应的Header后设计此方法,这个对下载大数据的时候相当有用,你可以在方法里做更多业务上的处理。
    c,requestDidFinishSelector,请求并响应成功完成时调用此方法
    d,requestDidFailSelector,请求失败
    e,queueDidFinishSelector,整个队列里的所有请求都结束时调用此方法。
      
    它是NSOperationQueues的扩展,小而强大。但也与它的父类略有区别。如,仅添加到队列中其实并不能执行请求,只有调用[  queue g o ]才会执行;一个正在运行中的队列,并不需要重复调用[  queue go  ]。

    引用
    默认情况下,队列中的一个请求如果失败,它会取消所有未完成的请求。可以设置[  queue setShouldCancelAllRequestsOnFailure:NO  ]来修 正。
     




    取消异步请求
    首先,同步请求是不能取消的。
    其次,不管是队列请求,还是简单的异步请求,全部调用[ request cancel ]来取消请求。


    引用
    取消的请求默认都会按请求失败处理,并调用请求失败delegate。
    如果不想调用delegate方法,则设置:[ request clearDelegatesAndCancel];



    队列请求中需要注意的是,如果你取消了一个请求,队列会自动取消其它所有请求。
    如果只想取消一个请求,可以设置队列:[ queue setShouldCancelAllRequestsOnFailure:NO ];
    如果想明确取消所有请求:[ queue cancelAllOperations ];

  • 相关阅读:
    Micorosoft 2013年笔试题
    Dropbox推荐使用
    swift_枚举 | 可为空类型 | 枚举关联值 | 枚举递归 | 树的概念
    swift_简单值 | 元祖 | 流程控制 | 字符串 | 集合
    Swift函数的定义
    swift_Dictionary 字典
    Xcode创建Object-C程序
    Spring事务管理者与Spring事务注解--声明式事务
    JDK注解替代Hibernate的Entity映射
    关于JAVA EE项目在WEB-INF目录下的jsp页面如何访问WebRoot中的CSS和JS文件
  • 原文地址:https://www.cnblogs.com/flower42/p/3426364.html
Copyright © 2011-2022 走看看