ASI使用介绍(同步与异步)

ASI 即  ASIHTTPRequest。 官方网站: http://allseeing-i.com/ASIHTTPRequest/ 。可以从上面下载到最新源码,以及获取到相关的资料。

使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。光说不练假把式,以下的几个章节我将介绍以下ASI的使用场合。这一节我介绍同步与异步的概念及使用。

同步与异步的概念:

同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事.

异步:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

ASI的同步使用

// 同步请求
- (void)sync
{
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    // 建立请求的request
    self.request = [ASIHTTPRequest requestWithURL:url];
    // 设置请求超时时长
    self.request.timeOutSeconds = 5;
    // 开始同步请求操作
    [self.request startSynchronous];

    if(self.request.error){
        NSLog(@"Error:%@",[self.request.error localizedDescription]);
    }
    else{
        // 响应相关信息
        NSLog(@"Return Code:%d, Return Message:%@",self.request.responseStatusCode,self.request.responseStatusMessage);

        NSLog(@"Return String:%@, Return Message:%@",self.request.responseString,self.request.responseData);

    }
}

当代码执行到

[self.request startSynchronous];

这一句的时候,线程会被阻塞,即后面的代码执行不了。必须等待网络数据返回回来的时候,才可以继续执行后面的代码。这也是同步请求的特色。

ASI的异步使用(实现ASIHTTPRequestDelegate)

// 异步请求
- (void)async {
    NSURL *url = [NSURL URLWithString:@"http://www.youku.com"];
    self.request = [ASIHTTPRequest requestWithURL:url];
    self.request.timeOutSeconds = 5;
    self.request.delegate = self;

    [self.request startAsynchronous];
}

代理方法

- (void)requestFinished:(ASIHTTPRequest *)request {
    // 响应相关信息
    NSLog(@"Return Code:%d, Return Message:%@",request.responseStatusCode,request.responseStatusMessage);
    NSLog(@"Return String:%@, Return Message:%@",request.responseString,request.responseData);
}

- (void)requestFailed:(ASIHTTPRequest *)request{

}

ASI的异步使用(block方式)

// 异步请求(block方式)
- (void)async
{
    NSURL *url = [NSURL URLWithString:@"http://www.youku.com"];
    self.request = [ASIHTTPRequest requestWithURL:url];

    self.request.timeOutSeconds = 5;

    [self.request setStartedBlock:^{
        NSLog(@"Begin");
    }];

    __weak typeof(self.request) that = self.request;
    [self.request setCompletionBlock:^{
        NSLog(@"Result:%@",[NSString stringWithFormat:@"data string:%@",that.responseString]);
    }];

    [self.request startAsynchronous];
}

关于异步请求,需要说明的两点

1. request 这个变量应该进行强引用工作,因为方法async执行完毕后,self.request这个对象就销毁了。在同步请求中不会出现问题,因为得到响应数据后,才销毁self.request对象,但在异步请求的时候对象就会丢失了,获取不到最终的响应数据。request属性定义如下:

@property (nonatomic,strong) ASIHTTPRequest *request;

2. 控制器对象销毁的时候,要销毁request对象! 因为当发出一个请求,也许5秒之后才有响应,没有等到响应回来的时候你就切换了控制器,则产生了野指针!!! 所以一定要在控制器销毁的时候调用下面代码!!

- (void)dealloc {
    [self.request clearDelegatesAndCancel];
}
时间: 2024-08-07 12:07:40

ASI使用介绍(同步与异步)的相关文章

关于同步,异步,阻塞,非阻塞的简单介绍

同步.异步.阻塞.非阻塞 同步:所谓同步就是当一个*调用另一个*时,在没有得到结果之前,该*调用*就不返回东西,一旦有结果,就得到返回值了.异步:所谓异步同同步相反,当一个*调用一个*时发出时,调用直接得到返回,所以没有返回结果.换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果.而是在*调用*发出后,*被调用者*通过状态.通知来通知调用者,或通过回调函数处理这个调用.举个通俗的例子:你打电话问书店老板有没有<分布式系统>这本书,如果是同步通信机制,书店老板会说,你稍等,"我

JDK中关于BIO,NIO,AIO,同步,异步介绍

在理解什么是BIO,NIO,AIO之前,我们首先需要了解什么是同步,异步,阻塞,非阻塞.假如我们现在要去银行取钱: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写); 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API); 阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回); 非阻塞 :

ASI使用介绍(文件下载)

前两节,我介绍了ASI的"同步与异步"及"文件上传"的知识,如有什么疑问的,请点击这里.这一节通过一个简单的例子,介绍一下通过ASI实现文件的下载. 界面很简单,"Start": 开始下载: "Stop": 暂停下载: 支持断点续传. 1.要定义一个request成员属性,对ASI的request对象进行强引用. @property(nonatomic,strong) ASIHTTPRequest *request; 2.实现

【Mocha.js 101】同步、异步与 Promise

前情提要 在上一篇文章<[Mocha.js 101]Mocha 入门指南>中,我们提到了如何用 Mocha.js 进行前端自动化测试,并做了几个简单的例子来体验 Mocha.js 给我们带来的便利. 在本篇文章中,我们将了解到 Mocha.js 的同步/异步测试,以及如何测试 Promise. 同步代码测试 在上一篇文章中,其实我们已经学会了如何测试同步代码.今天,我们 BDD 风格编写一个测试: var should = require( 'should' ); var Calculator

[Z] IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)

原文链接:http://blog.csdn.net/historyasamirror/article/details/5778378 当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事.<IO - 同步,异步,阻塞,非阻塞 >是我在开始学习epoll和libevent的时候写的,主要的思路来自于文中的那篇link .写完之后发现很多人都很喜欢,我还是非常开心的,也说明这个问题确实困扰了很多人.随着学习的深入,渐渐的感觉原来的理解有些偏差,但是还是没引起自己的重视,觉着

NSURLConnection同步和异步连接

NSURLConnection去加载一个URL请求时候有两种方式,一种是同步加载,一种是异步加载. 同步加载会阻塞当前的那个线程,如果将同步加载的代码放在主线程里去执行,那么就会阻塞主线程. 异步加载一种方式使用的是block,就算将加载的代码放到主线程去执行,也不会阻塞主线程.异步加载的另一种方式比较灵活.它可以在你需要的时候去启动,在你不需要的时候可以取消. 先看一个在主线程种同步和异步,以及使用GCD同步三种方式加载数据的阻塞情况 // // AppDelegate.m // NSURLC

.NET 同步与异步 之 EventWaitHandle(Event通知) (十三)

本随笔续接:.NET 同步与异步 之 Mutex (十二) 在前一篇我们已经提到过Mutex和本篇的主角们直接或间接继承自 WaitHandle: Mutex类,这个我们在上一篇已经讲过. EventWaitHandle 类及其派生类AutoResetEvent 和 ManualResetEvent,这是本篇的主角. Semaphore 类,即信号量,我们下一篇再讲(忽然觉得没有必要介绍了). WaitHandle提供了若干用于同步的方法.上一篇关于Mutex的blog中已经讲到一个WaitOn

.NET 同步与异步 之 线程安全的集合 (十一)

本随笔续接:.NET 同步与异步 之 警惕闭包(十) 无论之前说的锁.原子操作 还是 警惕闭包,都是为安全保驾护航,本篇随笔继续安全方面的主题:线程安全的集合. 先看一下命名空间:System.Collections.Concurrent,常用的类型有(均为泛型):BlockingCollection<T>.ConcurrentBag<T>.ConcurrentDictionary<TKey, TValue>.ConcurrentQueue<T>.Concu

.NET 同步与异步之锁(ReaderWriterLockSlim)(八)

本随笔续接:.NET 同步与异步之锁(Lock.Monitor)(七) 由于锁 ( lock 和 Monitor ) 是线程独占式访问的,所以其对性能的影响还是蛮大的,那有没有一种方式可是实现:允许多个线程同时读数据.只允许一个线程写数据呢?答案是肯定的. 读写锁 ReaderWriterLock .就是 支持单个写线程和多个读线程的锁.自.NET 3.5 开始 ReaderWriterLockSlim.登上舞台,ReaderWriterLockSlim 可以看做是 ReaderWriterLo