asi上传二进制图片 ios
2013-12-06 11:49:11 snakeking159 阅读数 440

参照网上的例子做的一次总结 切实可行

.h文件中

创建一个进度条,由ASI托管,添加开始和暂停两个事件   

#import <UIKit/UIKit.h>
#import "ASIHTTPRequest.h"
#import "ASINetworkQueue.h"

@interface ViewController : UIViewController<ASIHTTPRequestDelegate,ASIProgressDelegate>
{
    UIProgressView * _progressView;
}

@property (nonatomic,retain) UIProgressView* progressView;
@property (nonatomic,retain) ASINetworkQueue * asiNetQueue;
@property (nonatomic,retain) ASIHTTPRequest * asiHttpRequest;
- (IBAction)startClick:(id)sender;
- (IBAction)pauseClick:(id)sender;

.m文件中

@synthesize progressView=_progressView;
@synthesize asiNetQueue=_asiNetQueue;
@synthesize asiHttpRequest=_asiHttpRequest;

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    _progressView=[[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
    _progressView.frame=CGRectMake(10, 100, 300, 0);
    _progressView.progress=0.0f;
    
    
    [self.view addSubview:_progressView];
    [_progressView release];
    
    _asiNetQueue=[[ASINetworkQueue alloc] init];//开启队列
    [_asiNetQueue reset];//nil
    _asiNetQueue.showAccurateProgress=YES;
    [_asiNetQueue go];
}
//开始下载事件:
- (IBAction)startClick:(id)sender {
    NSURL * url=[NSURL URLWithString:@"http://fdfs.xmcdn.com/group1/M00/24/5E/wKgDrVH26tnQ3MJWAJJPLsXTccM542.mp3"];
    _asiHttpRequest=[ASIHTTPRequest requestWithURL:url];
    _asiHttpRequest.delegate=self;
    _asiHttpRequest.downloadProgressDelegate=self;
    
    //保存路径
    NSString * savePath=[NSHomeDirectory() stringByAppendingPathComponent:@"test.mp3"];
    
    //临时路径,开在开始后,先将已下载的数据存在临时文件中,任务完成后,将临时文件拷贝到 savePath
    NSString * temp=[NSHomeDirectory() stringByAppendingPathComponent:@"temp"];
    NSString * tempPath=[temp stringByAppendingPathComponent:@"test.mp3"];
    NSLog(@"%@",temp);
    //创建文件管理器
    NSFileManager * fileManager=[NSFileManager defaultManager];
    //判断temp文件夹是否存在,如果没有  创建
    BOOL fileExist=[fileManager fileExistsAtPath:temp];
    if (!fileExist) {
        [fileManager createDirectoryAtPath:temp withIntermediateDirectories:YES attributes:nil error:nil];
    }
    
    [_asiHttpRequest setDownloadDestinationPath:savePath];
    [_asiHttpRequest setTemporaryFileDownloadPath:tempPath];
    
    _asiHttpRequest.allowResumeForFileDownloads=YES;
    [_asiHttpRequest setDownloadProgressDelegate:self];
    
    //给当前请求设置一个标示,便于队列中有多个下载任务时 找到当前下载任务
    [_asiHttpRequest setUserInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:100] forKey:@"downLoadID"]];    
    //加入队列
    [_asiNetQueue addOperation:_asiHttpRequest];
}
//暂停下载
- (IBAction)pauseClick:(id)sender {
    for (ASIHTTPRequest *request in [_asiNetQueue operations]) {
        //查看userinfo信息
        NSInteger downLoadID = [[request.userInfo objectForKey:@"downLoadID"] intValue];
        if (100 == downLoadID) {
            //判断ID是否匹配 
            //暂停匹配对象 
            [request clearDelegatesAndCancel];
        }
    }
}
//滚动条的代理方法 
-(void)setProgress:(float)newProgress
{
    [_progressView setProgress:newProgress];
}






                            
2015-01-14 09:31:44 zhangqipu000 阅读数 435

ASIHTTPRequest官方文档(一)

分类: ios & cocoa 16762人阅读 评论(0) 收藏 举报

目录(?)[+]

翻译自http://allseeing-i.com/ASIHTTPRequest/How-to-use

1.创建并运行一个请求

1.1 创建一个同步请求

创建一个同步请求是使用ASIHTTPRequest的最简单的方式。发送消息startSynchronous会在同一个线程中执行这个请求,并且当请求结束的时候会返回控制权(成功或者其它的情况)。

通过error属性检查问题。

调用方法responseString从返回结果中获取字符串,不要使用这个方法获取二进制数据,使用方法responseData获得一个NSData对象。对于大的文件,设置你的请求的downloadDestinationPath属性用于下载文件。

      - (IBAction)grabURL:(id)sender

      {

               NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];

               ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

               [request startSynchronous];

               NSError *error = [request error];

               if (!error) {

                       NSString *response = [request responseString];

               }

        }

注意:一般来说,你应该优先使用异步请求而不是同步请求。当你在主线程中使用ASIHTTPRequest的同步请求时,你的应用的用户界面会被锁定并且在整个网络请求期间不可用。

1.2 创建一个异步请求

做与上一个例子相同的事情,但是这个请求在后台运行。

       - (IBAction)grabURLInBackground:(id)sender

      {

              NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];

              ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

              [request setDelegate:self];

              [request startAsynchronous];

       }

       - (void)requestFinished:(ASIHTTPRequest *)request

       {

              // Use when fetching text data

              NSString *responseString = [request responseString];

              // Use when fetching binary data

              NSData *responseData = [request responseData];

       }

       - (void)requestFailed:(ASIHTTPRequest *)request

       {

              NSError *error = [request error];

       }

我们设置了请求的delegate属性,所以当请求完成或失败时,我们能够接到通知。

这是创建异步请求的最简单的方式,它会在一个位于后台的全局的NSOperationQueue中运行。为了实现更多复杂的操作(例如跟踪多个请求的处理过程),你可能想创建自己的queue,这是下面将要讲到的。

1.3 使用blocks

从1.8版本起,我们可以在支持它们的平台上通过使用blocks完成上面例子的功能。

       - (IBAction)grabURLInBackground:(id)sender

      {

              NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];

              __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

              [request setCompletionBlock:^{

                    // Use when fetching textdata

                    NSString *responseString = [request responseString];

                    // Use when fetching binarydata

                    NSData *responseData = [request responseData];

              }];

              [request setFailedBlock:^{

                    NSError *error = [request error];

              }];

              [request startAsynchronous];

       }

    注意当我们声明这个请求时标识符__block的使用,这是非常重要的!它告诉这个block不要retain这个请求,因为这个请求总是retain这个block,这样就避免了一个retain-cycle 。

1.4 使用队列

这个例子做相同的事情,但是这次我们为我们的请求创建一个NSOperationQueue。

使用你创建的NSOperationQueue(或者下面讲到的ASINetworkQueue),就可以对异步请求进行更多的控制。当使用一个queue的时候,只有一定数量的请求同时运行。如果你向一个队列中添加的请求多于属性maxConcurrentOperationCount指定的数量,多出的请求会等到其它的请求结束才能开始运行。

       - (IBAction)grabURLInTheBackground:(id)sender

       {

              if (![self queue]) {

                    [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];

              }

              NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];

              ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

              [request setDelegate:self];

              [request setDidFinishSelector:@selector(requestDone:)];

              [request setDidFailSelector:@selector(requestWentWrong:)];

              [[self queue] addOperation:request]; //queue is anNSOperationQueue

       }

       - (void)requestDone:(ASIHTTPRequest *)request

       {

              NSString *response = [request responseString];

        }

        - (void)requestWentWrong:(ASIHTTPRequest *)request

       {

              NSError *error = [request error];

       }

       在上面的例子中,’queue’是我们控制器的一个retainedNSOperationQueue属性。

       我们设置自定义的selectors,它们会在请求成功或失败后被调用。如果你不设置这些,默认的(requestFinished:和requestFailed:)会向前面的例子中那样被使用。

 

1.5 在代理方法中处理多个请求的成功和失败状态

如果你需要处理多个请求的成功和失败的状态,你可以有几种选择:

1.           如果你的请求是相同的类型,但是你想区分它们,你可以用自定义的数据设置每个请求的字典类型的属性userInfo,这样你就可以在请求的成功或失败的代理方法中读取设置的值,通过这些值区分不同的请求。更简单的一种方式,你可以设置请求的tag属性。这两种属性是提供给你使用的,它们不会被发送到服务端。

2.           对于每个请求,如果你需要一个完全不同的方式处理成功或失败的返回结果,你可以针对每个请求设置不同的setDidFinishSelector和setDidFailSelector。

3.           对于更复杂的情况,或者说如果你想在后台解析返回结果,可以这堆每种类型的请求,创建ASIHttpRequest的一个最小子类,并且重载方法requestFinished:和failWithError:。

注意:最好避免在代理方法中通过请求的URL区分不同的请求,因为当重定向的时候URL属性会改变。如果你真的想使用请求的URL,可以使用[request originalURL],这样总会是第一次请求的url。

1.6 关于ASINetworkQueues

    ASINetworkQueue是类NSOperationQueue的子类,它提供了一些额外的功能。

它主要的目的是使你能够跟踪整个queue的上传和下载的过程。

另外,ASINetworkQueues提供了一些额外的代理方法:

l   requestDidStartSelector

    队列中的每个请求开始执行的时候调用这个方法。你可以使用它作为”设置你添加到queue的请求的代理方法并指定这个请求的didStartSelector”的替代方法。

l   requestDidReceiveResponseHeaderSeletor

当队列中的一个请求收到服务端回复的请求头时被调用。对于大数据量的下载,这个会在真正的下载完成之前被调用。你可以使用这个作为“设置你添加到queue中的请求的代理并且指定请求的didFailSelector”的一个替代方案。

l   requestDidFinishSelector

    当队列中一个请求成功时被调用。你可以使用这个作为“设置你添加到队列中请求的代理并指定一个didFinishSelector”的一个替代方案。

l    requestDidFailSelector

    当队列中一个请求失败时被调用。你可以使用这个作为“设置你添加到队列中请求的代理并指定一个didFailSelector”的一个替代方案。

l     queueDidFinishSelector

当整个队列完成时才被调用,不管单个的请求是成功还是失败。

要使用这些,可以设置队列的代理(而不是设置请求的代理)为实现这些selector的控制器。

       ASINetworkQueues的使用和NSOperationQueues有一点不同,就是添加到ASINetworkQueues的请求并不会马上开始执行。当使用一个ASINetworkQueue时,添加你想运行的操作,然后调用[queue go]。当你开启一个队列并打开“进度控制”标志时,它首先会为队列中的每个请求发送一个获取头部信息的请求,以获得要下载的数据的大小。一旦队列获得了要下载的大小,它能准确的显示整个下载过程,真正的下载也会开始。

注意:

       当你添加一个请求到一个已经开始的ASINetworkQueue中会发生什么?当你使用ASINetworkQueue跟踪一些请求的整个进展,当添加一个新的请求到队列,只有新的请求开始运行的时候,整个队列会进入后台运行。当队列开始运行的时候后,新添加的请求不会再请求头部信息,所以当你一次添加很多请求到一个已经开始运行的队列,整个进度不会立刻更新。

如果一个队列已经开始运行,你不需要再调用[queuego]。

 

    当ASINetworkQueue中的一个请求执行失败时,队列默认会取消所有的请求。你可以通过 [queue setShouldCancelAllRequestsOnFailure:NO]

取消这个属性。

 ASINetworkQueue只能运行ASIHTTPRequest操作,它们不能用于一般的操作。添加一个非ASIHTTPRequest的NSOperation会触发一个异常。

     注意:这个一个完整的演示基本的创建和使用ASINetworkQueue例子:http://gist.github.com/150447

1.7 取消一个异步请求

       调用[request cancel]取消一个异步请求(一个以[ [request startAsynchronous] ]开始的请求或者你创建的运行在队列中的请求)。注意你不能取消一个同步请求。

当你取消一个请求,这个请求会把这个当作一个错误,会调用请求的代理或者队列的代理的失败处理方法。如果你不希望这个行为,在取消一个请求之前设置这个请求的代理为nil或者使用方法clearDelegatesAndCancel取消请求。

           //Cancels an asynchronous request

           [requestcancel]

           //Cancels an asynchronous request, clearing all delegates and blocks first

            [requestclearDelegatesAndCancel];

使用一个ASINetworkQueue时,当你取消了队列中的一个请求,那么队列中所有的请求都会被取消除非你设置了队列的属性shouldCancelAllRequestsOnFailure为NO(YES是默认值)。

        // When a request inthis queue fails or is cancelled, other requests will continue to run

        [queuesetShouldCancelAllRequestsOnFailure:NO];

        // Cancel all requestsin a queue

        [queue cancelAllOperations];

1.8 当一个请求将要结束之前安全的处理即将被销毁的代理

请求不retain它们的代理,所以当请求正在执行的时候你的代理可能会被释放掉,清除请求的代理属性是至关重要的。在大多数情况下,如果你的代理将要被释放,你也不再关心这个请求的状态,所以你可能也想取消这个请求。

    在下面的例子中,我们的控制器有一个属性为retain的ASIHTTPRequest类型的实例变量。我们在方法delloc的实现中调用请求的clearDelegatesAndCancel方法,正好在在释放这个请求之前。

       // Ddealloc method for ourcontroller

       - (void)dealloc

       {

              [requestclearDelegatesAndCancel];

               [requestrelease];

               ...

              [superdealloc];

       }

2.发送数据

2.1 设置请求头

              ASIHTTPRequest *request =[ASIHTTPRequest requestWithURL:url];

              [requestaddRequestHeader:@"Referer"value:@"http://allseeing-i.com/"];

2.2 使用ASIFormDataRequest发送一个POST请求

    可以使用ASIFormDataRequest发送与网页格式兼容的POST请求。以application/x-www-form-urlencoded格式POST数据或者以multipart/form-data格式POST二进制数据或文件。如果需要文件中的数据会从硬盘读取,所以可以提交大的文件,只要你的Web服务器支持处理它们。

              ASIFormDataRequest *request = [ASIFormDataRequestrequestWithURL:url];

              [request setPostValue:@"Ben"forKey:@"first_name"];

              [request setPostValue:@"Copsey"forKey:@"last_name"];

              [request setFile:@"/Users/ben/Desktop/ben.jpg"forKey:@"photo"];

       ASIFormDataRequest会自动检测通过方法setFile:forKey添加到POST的文件的mine类型,并且把这个添加到mime头中发送到服务端。如果你愿意,你可以使用更长的形式代替这种方式:

              ASIFormDataRequest *request = [ASIFormDataRequestrequestWithURL:url];

              // Upload a file on disk

              [request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg"andContentType:@"image/jpeg" forKey:@"photo"];

              // Upload an NSData instance

              [request setData:imageData withFileName:@"myphoto.jpg"andContentType:@"image/jpeg" forKey:@"photo"];

       你可以使用add接口针对一个参数发送多个值:

              ASIFormDataRequest *request = [ASIFormDataRequestrequestWithURL:url];

              [request addPostValue:@"Ben" forKey:@"names"];

              [request addPostValue:@"George"forKey:@"names"];

              [request addFile:@"/Users/ben/Desktop/ben.jpg"forKey:@"photos"];

              [requestaddData:imageData withFileName:@"george.jpg"andContentType:@"image/jpeg" forKey:@"photos"];

       查看ASIFormDataRequest.h获取向POST添加参数的全部的方法列表。

2.3 PUT请求和自定义POSTs

    如果你想通过PUT发送数据,或者想通过POST但是想自己创建POST包体,可以使用appendPostData:or appendPostDataFromFile:。

              ASIHTTPRequest *request =[ASIHTTPRequest requestWithURL:url];

              [request appendPostData:[@"Thisis my data" dataUsingEncoding:NSUTF8StringEncoding]];

              // Default becomes POST when you useappendPostData: / appendPostDataFromFile: / setPostBody:

              [requestsetRequestMethod:@"PUT"];

       如果你想发送大量的数据但是不想使用ASIFormDataRequest,可以看下面将要介绍的“informationon streaming post bodies from disk ”。

3.下载数据

3.1 直接把回复内容下载到文件

如果你请求的资源非常的大,你可以直接下载到文件以节省内存。这样的话,ASIHTTPRequest不需要一下子在内存中维护所有的回复内容。

              ASIHTTPRequest*request = [ASIHTTPRequest requestWithURL:url];

              [requestsetDownloadDestinationPath:@"/Users/ben/Desktop/my_file.txt"];

       当你使用属性downloadDestinationPath下载数据到一个文件时,在请求处理过程中数据会保存在一个临时文件中。当请求完成时,下面两个事情的其中一个会发生:

l   如果数据是gzip压缩的(查看gzip压缩数据),被压缩的文件会解压到downloadDestinationPath指定的路径下,临时文件会被删除。

l   如果数据不是压缩的,临时文件会被移动到downloadDestinationPath指定的路径下,并会覆盖同名的文件。

注意:如果回复的包体是空的,文件不会被创建。如果一个请求可能会返回一个空的包体,再你做任何尝试之前,请先检查下文件是否存在。

3.2 处理到来的回复数据

       如果你需要处理到来的包体数据(比如:当数据还在下载的时候使用“流解析“解析回复的数据),实现代理的request:didReceiveData:方法(查看ASIHTTPRequestDelegate.h)。注意当你这样做的时候,ASIHTTPRequest不会填充responseData,也不会把回复数据写入到downloadDestinationPath指定的路径,如果你需要你必须自己保存回复的数据。

3.3 读取HTTP状态码

对于大部分HTTP状态码,ASIHTTPRequest不会做任何特殊的事情(除了重定向和认证状态码,查看下面的内容获取更多信息),因此需要你查找问题并确认你是否操作得当。

              ASIHTTPRequest *request =[ASIHTTPRequest requestWithURL:url];

              [request startSynchronous];

              int statusCode = [requestresponseStatusCode];

              NSString *statusMessage = [request responseStatusMessage];

3.4 读取回复的头部信息

              ASIHTTPRequest*request = [ASIHTTPRequest requestWithURL:url];

              [requeststartSynchronous];

              NSString*poweredBy = [[request responseHeaders]objectForKey:@"X-Powered-By"];

              NSString *contentType = [[requestresponseHeaders] objectForKey:@"Content-Type"];

3.5 处理文本编码

ASIHTTPRequest会尝试从头部的Content-Type字段读取接收到的数据的文本编码,如果它发现一个文本编码,它会设置字段responseEncoding为一个合适的 NSStringEncoding。如果它在头部字段没有发现一个文本编码,它会使用字段defaultResponseEncoding的默认值(这个字段默认值为NSISOLatin1StringEncoding)。

    当你调用[request responseString], ASIHTTPRequest会创建一个字符串,并尝试以responseEncoding指定的编码方式把接收到的数据转化到创建的字符串中。

3.6 处理重定向

ASIHTTPRequest会自动的重定向到一个新的URL当它遇到下面的一个HTTP状态码,假设一个本地的头已经发送:

l   301 Moved Permanently

l   302 Found

l   303 See Other

       当重定向发生时, responsedata的值(例如responseHeaders / responseCookies / responseData / responseString )会是从最后的地址接收到的值。

重定向的url的Cookies会存储到一个全局的cookie存储中,适当的时候会在一个重定向请求中表示服务器。

    你可以通过设置请求的属性shouldRedirect为NO关闭重定向。

注意:

       默认情况下,自动重定向只针对GET请求(没有消息体)。指定301和302重定向需要使用最初的方法符合多数浏览器的工作方式,不是HTTP协议特定的。

为了保存最初的方法(包括请求体)

针对301和302重定向,为了保存最初的方法(包括请求体),需要在请求开始执行之前,设置请求的属性shouldUseRFC2616RedirectBehaviour为YES。

2017-06-17 22:42:12 shihuboke 阅读数 214

 //联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄


ASI “HTTP访问终结者201211月停止更新


AFN的对比


AFN

1.基于 NSURLConnection & NSURLSession进行的封装

2.使用简单

3.提供了自动的序列化 &反序列化支持!

ASI

1.基于 CFNetwork进行的封装 Core Foundation,是底层的 C语言的框架,ASI的效率是跟好的

2.使用非常灵活,给程序员提供了各种使用的可能和空间!

* 用代理

*用块代码

*自定义监听方法

*自定义代理->开发者可以定制专属自己的网络管理工具!


提示:真正开发中,只要选择一个我们比较能够掌握的就可以了!


3.使用难度大

4. MRC的,需要考虑到 ARC & MRC混编的问题

5.返回内容只是提供了二进制数据,或者字符串(前提结果确实是字符串!)

ASI的序列化和反序列化需要程序员自己来!


-其他

是否会使用 ASI,说明你是否是一个资深的 iOS 程序员

目前仍然后很多大的项目,在使用 ASI,原因:

1>大的项目开发时间比较长,不好更换

2>大的项目对网络请求的复杂度要求比较高!AFN无法胜任!


阅读官方示例程序笔记


#import "ASIHTTPRequest.h"


1. url

NSURL *url = [NSURL URLWithString:[urlField text]];


2. request

[self setRequest:[ASIHTTPRequest requestWithURL:url]];


3.发起同步请求

[request startSynchronous];

// 异步请求

[request startAsynchronous];


4.能够获得数据了!


获得一个信息:ASI中,绝大多数的功能都封装在 ASI的请求中!


ASI block使用的细节:


*** 如果同时设置了代理和块代码,两个方法都会被执行,而且先执行代理的方法,后执行block的方法!

*** 在使用 block时,如果设计到引用 request,需要注意不要出现循环引用!


__weak typeof(request) weakRequest = request;

[request setCompletionBlock:^{

    NSLog(@"block - %@", weakRequest.responseString);

}];


block iOS4.0之后,苹果推出的,ASI默认的设备版本是3.1.3,支持2.0

ASI最开始是没有block的,在1.8版本之后,才增加了block的功能!



面试题:在使用block的时候,什么时候会出现循环引用,如何解决?


在使用 ASI的时候,如果没有特殊情况,使用代理会更安全!



*** ASI 使用的一个很重要的注意事项


视图控制器销毁之前,需要清理 request的代理并且取消请求,否则会造成野指针访问


// 取消下载任务

[self.request clearDelegatesAndCancel];



关于第三方框架源代码的阅读:


1. OC的代码可以使劲看

2. C语言的代码,看看头文件,知道接口,能够画出大概的功能接口线路图就行了!



2014-03-03 15:03:21 zhaopenghhhhhh 阅读数 4008

在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用户体验,为了不是每次显示都需要从网上下载数据,希望将图片放到本地缓存,因此我们需要一个好的的缓存策略,今天我将我在项目工程中的实际经验分享给大家,我这里主要介绍一下强大的ASIHTTPRequest的缓存策略,以及使用方法:

 

    下面是具体步骤:

一、设置缓存策略

    首先在SplitDemoAppDelegate委托代理中,实现如下代码:

    在SplitDemoAppDelegate.h文件中,代码如下:

 

复制代码
 1 #import <UIKit/UIKit.h>
 2 
 3 @class ASIDownloadCache;
 4 
 5 @interface SplitDemoAppDelegate : NSObject <UIApplicationDelegate,UITabBarControllerDelegate> {
 6 
 7     UIWindow *_window;
 8 
 9     ASIDownloadCache*_downloadCache;            //下载缓存策略
10 
11 }
12 
13 @property (nonatomic, retain) ASIDownloadCache*downloadCache;
14 
15 @end
复制代码

 

在SplitDemoAppDelegate.m文件中,代码如下:

复制代码
 1 #import "SplitDemoAppDelegate.h"
 2 
 3 @implementation SplitDemoAppDelegate
 4 
 5 @synthesize window=_window;
 6 
 7 @synthesize downloadCache = _downloadCache;
 8 
 9 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
10 
11 {
12 
13     //初始化ASIDownloadCache缓存对象
14 
15    ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];
16 
17    self.downloadCache = cache;
18 
19   [cache release];
20 
21 
22    //路径
23 
24    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
25 
26   NSString *documentDirectory = [paths objectAtIndex:0];
27 
28    //设置缓存存放路径
29 
30    [self.downloadCache setStoragePath:[documentDirectorystringByAppendingPathComponent:@"resource"]];
31 
32    //设置缓存策略
33 
34     [self.downloadCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
35 
36     // Override point for customization after application launch.
37 
38     [self.window makeKeyAndVisible];
39 
40     return YES;
41 
42 }
43 
44 
45 - (void)dealloc
46 
47 {
48 
49     [_window release];
50 
51     [_downloadCache release];
52 
53    [super dealloc];
54 
55 }
56 
57 @end
复制代码

 

    二、创建缓存线程

    这一步是创建一个NSOperation类,实现缓存的方法,代码如下:

    ResourceContainer.h文件实现:

 

复制代码
 1 #import <Foundation/Foundation.h>
 2 
 3 #import "ASIHTTPRequest.h"
 4 
 5 #import "SplitDemoAppDelegate.h"
 6 
 7  
 8 
 9 @interface ResourceContainer : NSOperation {
10 
11 NSURL*_resourceURL;            //资源请求url
12 
13 NSObject*_hostObject;             
14 
15 SEL_resourceDidReceive;      //资源接手响应方法  
16 
17 SplitDemoAppDelegate*_appDelegate;            //应用委托对象
18 
19 ASIHTTPRequest*_httpRequest;            
20 
21 UIImageView*_imageView;              
22 
23 }
24 
25  
26 
27 @property (nonatomic, retain) NSURL*resourceURL;
28 
29 @property (nonatomic, retain) NSObject*hostObject;
30 
31 @property (nonatomic, assign) SELresourceDidReceive;
32 
33 @property (nonatomic, assign) SplitDemoAppDelegate   *appDelegate;
34 
35 @property (nonatomic, retain) ASIHTTPRequest*httpRequest;
36 
37 @property (nonatomic, retain) UIImageView*imageView;
38 
39  
40 
41 //http请求回调方法
42 
43 -(void)didStartHttpRequest:(ASIHTTPRequest *)request;
44 
45 -(void)didFinishHttpRequest:(ASIHTTPRequest *)request;
46 
47 -(void)didFailedHttpRequest:(ASIHTTPRequest *)request;
48 
49  
50 
51 //取消资源请求
52 
53 -(void)cancelReourceGet;
54 
55 //资源接收回调方法
56 
57 -(void)resourceDidReceive:(NSData *)resource;
58 
59 @end
复制代码

 

ResourceContainer.m文件实现:

复制代码
  1 #import "ResourceContainer.h"
  2 #import "HttpConstant.h"
  3 #import "ASIDownloadCache.h"
  4 @implementation ResourceContainer
  5 @synthesize resourceURL = _resourceURL;
  6 @synthesize hostObject = _hostObject;
  7 @synthesize resourceDidReceive = _resourceDidReceive;
  8 @synthesize appDelegate = _appDelegate;
  9 @synthesize httpRequest = _httpRequest;
 10 @synthesize imageView = _imageView;
 11 
 12 -(id)init{
 13 
 14      if(self == [super init]){
 15 
 16      self.appDelegate = (SplitDemoAppDelegate *)[[UIApplication        sharedApplication] delegate];
 17 
 18       }
 19 
 20    return self;
 21 
 22 }
 23 
 24 
 25 -(void)main{
 26 
 27       if(self.hostObject == nil)
 28       return;
 29 
 30      if(self.resourceURL == nil){
 31           [self resourceDidReceive:nil];
 32           return;
 33      }
 34 
 35       ASIHTTPRequest *request = [ASIHTTPRequest     requestWithURL:self.resourceURL]
 36       self.httpRequest = request;
 37 
 38  
 39 
 40 [self.httpRequest setDownloadCache:self.appDelegate.downloadCache];
 41 [self.httpRequest setDelegate:self];
 42 [self.httpRequest setDidStartSelector:@selector(didStartHttpRequest:)];
 43 [self.httpRequest setDidFinishSelector:@selector(didFinishHttpRequest:)];
 44 [self.httpRequest setDidFailSelector:@selector(didFailedHttpRequest:)];
 45 
 46     //发异步请求
 47 
 48 [self.httpRequest startAsynchronous];
 49 
 50 }
 51 
 52 - (void)dealloc {
 53 
 54 [_resourceURL release];
 55 [_hostObject release];
 56 [_httpRequest release];
 57 [_imageView release];
 58 [super dealloc];
 59 
 60 }
 61 
 62 //开始请求
 63 
 64 -(void)didStartHttpRequest:(ASIHTTPRequest *)request{
 65 
 66 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
 67 
 68 }
 69 
 70 //请求成功返回处理结果
 71 
 72 -(void)didFinishHttpRequest:(ASIHTTPRequest *)request{
 73 
 74 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
 75 
 76  
 77 
 78     if([request responseStatusCode] == 200 || [request responseStatusCode] == 304){
 79 
 80 //判断是否来自缓存
 81 
 82         if([request didUseCachedResponse]){
 83 
 84 NSLog(@"=========资源请求:%@ 来自缓存============",[self.resourceURL absoluteURL]);
 85 
 86         }
 87          else{
 88 
 89             NSLog(@"=========资源请求:图片不来自缓存============");
 90         }
 91 
 92 
 93      [self resourceDidReceive:[request responseData]];
 94 
 95 }
 96 
 97 else {
 98 
 99        [self resourceDidReceive:nil];
100 
101        }
102 
103 }
104 
105 //失败请求返回处理结果
106 
107 -(void)didFailedHttpRequest:(ASIHTTPRequest *)request{
108 
109 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
110 
111 [self resourceDidReceive:nil];
112 
113 }
114 
115 //取消资源请求
116 
117 -(void)cancelReourceGet{
118 
119 [self.httpRequest cancel];
120 
121 }
122 
123 //资源接收处理方法
124 
125 -(void)resourceDidReceive:(NSData *)resource{
126 
127 if([self.hostObject respondsToSelector:self.resourceDidReceive]){
128 
129 if(resource != nil && self.imageView != nil){
130 
131 self.imageView.image = [UIImage imageWithData:resource];
132 
133 }
134 
135 
136 [self.hostObject performSelectorOnMainThread:self.resourceDidReceive withObject:self.imageViewwaitUntilDone:NO];
137 
138 }
139 
140 }
141 
142 @end 
复制代码

 

    到第二步,我们的缓存策略的设置,以及资源请求和接收数据方法已经构建完毕,下面介绍一下如何使用我们上面创建的NSOperation类

 

    三、图片请求(利用上面创建的类)

    这里以我的工程为例进行分析:

在DetailViewController.h声明文件中:

 

复制代码
 1 #import <UIKit/UIKit.h>
 2 
 3 @interface DetailViewController :UIViewController {
 4 
 5     NSURL                         *_imageURL;                    //图片url
 6 
 7     NSMutableArray            *_originalIndexArray;        //保存请求图片的号
 8 
 9     NSMutableDictionary     *_originalOperationDic;     //保存图片请求队列
10 
11     NSOperationQueue        *_requestImageQueue;    //图片请求队列
12 
13 }
14 
15 @property (nonatomic, retain) NSURL                       *imageURL;
16 @property (nonatomic, retain) NSMutableArray          *originalIndexArray;
17 @property (nonatomic, retain) NSMutableDictionary   *originalOperationDic;
18 @property (nonatomic, retain) NSOperationQueue      * requestImageQueue;
19 
20 //显示图片信息
21 
22 -(void)displayProductImage;
23 
24 //根据图片序号显示请求图片资源
25 
26 -(void)displayImageByIndex:(NSInteger)index ByImageURL:(NSURL *)url;
27 
28 //处理图片请求返回信息
29 
30 -(void)imageDidReceive:(UIImageView *)imageView;
31 
32 @end
复制代码



 

 在DetailViewController.m实现文件中:

复制代码
  1 #import "ProductDetailViewController.h"
  2 
  3 //这里引入在第二步中,我们创建的对象
  4 #import "ResourceContainer.h"
  5 
  6 @implementation DetailViewController
  7 @synthesize imageURL = _imageURL;
  8 @synthesize originalIndexArray = _originalIndexArray;
  9 @synthesize originalOperationDic = _originalOperationDic;
 10 @synthesize requestImageQueue = _requestImageQueue;
 11 
 12 
 13 - (void)viewDidLoad
 14 
 15 {
 16 
 17      [super viewDidLoad];
 18      NSOperationQueue *tempQueue = [[NSOperationQueue alloc] init];
 19 
 20      self.requsetImageQueue = tempQueue;
 21      [tempQueue release];
 22 
 23       NSMutableArray *array = [[NSMutableArray alloc] init];
 24 
 25       self.originalIndexArray = array;
 26       [array release];
 27 
 28        NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
 29 
 30        self.originalOperationDic = dic;
 31        [dic release];
 32 
 33 }
 34 
 35 //显示图片信息
 36 
 37 -(void)displayProductImage
 38 
 39 {
 40 
 41     NSURL *url = [NSURL URLWithString:@"http://xxx.xxx.xxx.xxx"];
 42 
 43     //这个是从器返回有图片数目,self.xxxx根据具体的场合
 44 
 45     int imageCount = [self.xxxx.imageNum intValue];
 46 
 47     for (int i=0; i<imageCount; i++) {
 48 
 49         NSString *str1 = @"这里是拼图片请求url,根据实际需求";
 50 
 51         self.imageURL = [url URLByAppendingPathComponent:str1];
 52 
 53         //根据图片号请求资源
 54 
 55         [self displayImageByIndex:i ByImageURL:self.productImageURL];
 56 
 57     }
 58 
 59 }
 60 
 61 //根据图片序号显示请求图片资源
 62 
 63 -(void) displayImageByIndex:(NSInteger)index ByImageURL:(NSURL *)url
 64 
 65 {
 66 
 67     NSString *indexForString = [NSString stringWithFormat:@"%d",index];
 68 
 69     //若数组中已经存在该图片编号,说明图片加载完毕,直接返回
 70 
 71     if ([self.originalIndexArray containsObject:indexForString]) {
 72 
 73          return;
 74 
 75     }
 76 
 77     //创建UIImageView对象
 78 
 79     UIImageView *imageView = [[UIImageView alloc] init];
 80 
 81     imageView.tag = index;
 82 
 83     //创建资源请求对象
 84 
 85     ResourceContainer  *imageOperation = [[ResourceContainer alloc] init];
 86 
 87     imageOperation.resourceURL = url;
 88 
 89     imageOperation.hostObject = self;
 90 
 91     //设置收到图片信息处理理方法
 92 
 93     imageOperation.resourceDidReceive = @selector(imageDidReceive:);
 94 
 95     imageOperation.imageView = imageView;
 96 
 97     [imageView release];
 98 
 99     //将图片请求对象加入图片请求队列中
100 
101     [self.requsetImageQueue addOperation:imageOperation];
102 
103     [self.originalOperationDic setObject:imageOperation forKey:indexForString];
104 
105     [imageOperation release];
106 
107 }
108 
109 //处理图片请求返回信息
110 
111 -(void)imageDidReceive:(UIImageView *)imageView
112 
113 {
114 
115     if (imageView == nil||imageView.image == nil) {
116 
117             imageView.image = [UIImage imageNamed:@"no-pic-300-250.png"];
118 
119      }
120 
121     //将图片信息加载到前台,self.openFlowView是我用的coverFlow,coverFlow的使用方法网上很多,自己找吧
122 
123     [self.openFlowView setImage:imageView.image forIndex:imageView.tag];
124 
125     [self.originalIndexArray addObject:[NSString stringWithFormat:@"%d",imageView.tag]];
126 
127     [self.originalOperationDic removeObjectForKey:[NSString stringWithFormat:@"%d",imageView.tag]];
128 
129 }
130 
131 - (void)dealloc
132 
133 {
134      [_requestImageQueue release];
135 
136      [_originalIndexArray release];
137 
138      [_originalOperationDic release];
139 
140      [_imageURL release];
141 
142      [super dealloc];
143 
144 }
145 
146 @end
复制代码
2014-10-10 14:51:51 jinyeweiyang 阅读数 228

在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用户体验,为了不是每次显示都需要从网上下载数据,希望将图片放到本地缓存,因此我们需要一个好的的缓存策略,今天我将我在项目工程中的实际经验分享给大家,我这里主要介绍一下强大的ASIHTTPRequest的缓存策略,以及使用方法:

 

    下面是具体步骤:

一、设置缓存策略

    首先在SplitDemoAppDelegate委托代理中,实现如下代码:

    在SplitDemoAppDelegate.h文件中,代码如下:

 

复制代码
 1 #import <UIKit/UIKit.h>
 2 
 3 @class ASIDownloadCache;
 4 
 5 @interface SplitDemoAppDelegate : NSObject <UIApplicationDelegate,UITabBarControllerDelegate> {
 6 
 7     UIWindow *_window;
 8 
 9     ASIDownloadCache*_downloadCache;            //下载缓存策略
10 
11 }
12 
13 @property (nonatomic, retain) ASIDownloadCache*downloadCache;
14 
15 @end
复制代码

 

在SplitDemoAppDelegate.m文件中,代码如下:

复制代码
 1 #import "SplitDemoAppDelegate.h"
 2 
 3 @implementation SplitDemoAppDelegate
 4 
 5 @synthesize window=_window;
 6 
 7 @synthesize downloadCache = _downloadCache;
 8 
 9 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
10 
11 {
12 
13     //初始化ASIDownloadCache缓存对象
14 
15    ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];
16 
17    self.downloadCache = cache;
18 
19   [cache release];
20 
21 
22    //路径
23 
24    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
25 
26   NSString *documentDirectory = [paths objectAtIndex:0];
27 
28    //设置缓存存放路径
29 
30    [self.downloadCache setStoragePath:[documentDirectorystringByAppendingPathComponent:@"resource"]];
31 
32    //设置缓存策略
33 
34     [self.downloadCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
35 
36     // Override point for customization after application launch.
37 
38     [self.window makeKeyAndVisible];
39 
40     return YES;
41 
42 }
43 
44 
45 - (void)dealloc
46 
47 {
48 
49     [_window release];
50 
51     [_downloadCache release];
52 
53    [super dealloc];
54 
55 }
56 
57 @end
复制代码

 

    二、创建缓存线程

    这一步是创建一个NSOperation类,实现缓存的方法,代码如下:

    ResourceContainer.h文件实现:

 

复制代码
 1 #import <Foundation/Foundation.h>
 2 
 3 #import "ASIHTTPRequest.h"
 4 
 5 #import "SplitDemoAppDelegate.h"
 6 
 7  
 8 
 9 @interface ResourceContainer : NSOperation {
10 
11 NSURL*_resourceURL;            //资源请求url
12 
13 NSObject*_hostObject;             
14 
15 SEL_resourceDidReceive;      //资源接手响应方法  
16 
17 SplitDemoAppDelegate*_appDelegate;            //应用委托对象
18 
19 ASIHTTPRequest*_httpRequest;            
20 
21 UIImageView*_imageView;              
22 
23 }
24 
25  
26 
27 @property (nonatomic, retain) NSURL*resourceURL;
28 
29 @property (nonatomic, retain) NSObject*hostObject;
30 
31 @property (nonatomic, assign) SELresourceDidReceive;
32 
33 @property (nonatomic, assign) SplitDemoAppDelegate   *appDelegate;
34 
35 @property (nonatomic, retain) ASIHTTPRequest*httpRequest;
36 
37 @property (nonatomic, retain) UIImageView*imageView;
38 
39  
40 
41 //http请求回调方法
42 
43 -(void)didStartHttpRequest:(ASIHTTPRequest *)request;
44 
45 -(void)didFinishHttpRequest:(ASIHTTPRequest *)request;
46 
47 -(void)didFailedHttpRequest:(ASIHTTPRequest *)request;
48 
49  
50 
51 //取消资源请求
52 
53 -(void)cancelReourceGet;
54 
55 //资源接收回调方法
56 
57 -(void)resourceDidReceive:(NSData *)resource;
58 
59 @end
复制代码

 

ResourceContainer.m文件实现:

复制代码
  1 #import "ResourceContainer.h"
  2 #import "HttpConstant.h"
  3 #import "ASIDownloadCache.h"
  4 @implementation ResourceContainer
  5 @synthesize resourceURL = _resourceURL;
  6 @synthesize hostObject = _hostObject;
  7 @synthesize resourceDidReceive = _resourceDidReceive;
  8 @synthesize appDelegate = _appDelegate;
  9 @synthesize httpRequest = _httpRequest;
 10 @synthesize imageView = _imageView;
 11 
 12 -(id)init{
 13 
 14      if(self == [super init]){
 15 
 16      self.appDelegate = (SplitDemoAppDelegate *)[[UIApplication        sharedApplication] delegate];
 17 
 18       }
 19 
 20    return self;
 21 
 22 }
 23 
 24 
 25 -(void)main{
 26 
 27       if(self.hostObject == nil)
 28       return;
 29 
 30      if(self.resourceURL == nil){
 31           [self resourceDidReceive:nil];
 32           return;
 33      }
 34 
 35       ASIHTTPRequest *request = [ASIHTTPRequest     requestWithURL:self.resourceURL]
 36       self.httpRequest = request;
 37 
 38  
 39 
 40 [self.httpRequest setDownloadCache:self.appDelegate.downloadCache];
 41 [self.httpRequest setDelegate:self];
 42 [self.httpRequest setDidStartSelector:@selector(didStartHttpRequest:)];
 43 [self.httpRequest setDidFinishSelector:@selector(didFinishHttpRequest:)];
 44 [self.httpRequest setDidFailSelector:@selector(didFailedHttpRequest:)];
 45 
 46     //发异步请求
 47 
 48 [self.httpRequest startAsynchronous];
 49 
 50 }
 51 
 52 - (void)dealloc {
 53 
 54 [_resourceURL release];
 55 [_hostObject release];
 56 [_httpRequest release];
 57 [_imageView release];
 58 [super dealloc];
 59 
 60 }
 61 
 62 //开始请求
 63 
 64 -(void)didStartHttpRequest:(ASIHTTPRequest *)request{
 65 
 66 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
 67 
 68 }
 69 
 70 //请求成功返回处理结果
 71 
 72 -(void)didFinishHttpRequest:(ASIHTTPRequest *)request{
 73 
 74 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
 75 
 76  
 77 
 78     if([request responseStatusCode] == 200 || [request responseStatusCode] == 304){
 79 
 80 //判断是否来自缓存
 81 
 82         if([request didUseCachedResponse]){
 83 
 84 NSLog(@"=========资源请求:%@ 来自缓存============",[self.resourceURL absoluteURL]);
 85 
 86         }
 87          else{
 88 
 89             NSLog(@"=========资源请求:图片不来自缓存============");
 90         }
 91 
 92 
 93      [self resourceDidReceive:[request responseData]];
 94 
 95 }
 96 
 97 else {
 98 
 99        [self resourceDidReceive:nil];
100 
101        }
102 
103 }
104 
105 //失败请求返回处理结果
106 
107 -(void)didFailedHttpRequest:(ASIHTTPRequest *)request{
108 
109 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
110 
111 [self resourceDidReceive:nil];
112 
113 }
114 
115 //取消资源请求
116 
117 -(void)cancelReourceGet{
118 
119 [self.httpRequest cancel];
120 
121 }
122 
123 //资源接收处理方法
124 
125 -(void)resourceDidReceive:(NSData *)resource{
126 
127 if([self.hostObject respondsToSelector:self.resourceDidReceive]){
128 
129 if(resource != nil && self.imageView != nil){
130 
131 self.imageView.image = [UIImage imageWithData:resource];
132 
133 }
134 
135 
136 [self.hostObject performSelectorOnMainThread:self.resourceDidReceive withObject:self.imageViewwaitUntilDone:NO];
137 
138 }
139 
140 }
141 
142 @end 
复制代码

 

    到第二步,我们的缓存策略的设置,以及资源请求和接收数据方法已经构建完毕,下面介绍一下如何使用我们上面创建的NSOperation类

 

    三、图片请求(利用上面创建的类)

    这里以我的工程为例进行分析:

在DetailViewController.h声明文件中:

 

复制代码
 1 #import <UIKit/UIKit.h>
 2 
 3 @interface DetailViewController :UIViewController {
 4 
 5     NSURL                         *_imageURL;                    //图片url
 6 
 7     NSMutableArray            *_originalIndexArray;        //保存请求图片的号
 8 
 9     NSMutableDictionary     *_originalOperationDic;     //保存图片请求队列
10 
11     NSOperationQueue        *_requestImageQueue;    //图片请求队列
12 
13 }
14 
15 @property (nonatomic, retain) NSURL                       *imageURL;
16 @property (nonatomic, retain) NSMutableArray          *originalIndexArray;
17 @property (nonatomic, retain) NSMutableDictionary   *originalOperationDic;
18 @property (nonatomic, retain) NSOperationQueue      * requestImageQueue;
19 
20 //显示图片信息
21 
22 -(void)displayProductImage;
23 
24 //根据图片序号显示请求图片资源
25 
26 -(void)displayImageByIndex:(NSInteger)index ByImageURL:(NSURL *)url;
27 
28 //处理图片请求返回信息
29 
30 -(void)imageDidReceive:(UIImageView *)imageView;
31 
32 @end
复制代码



 

 在DetailViewController.m实现文件中:

复制代码
  1 #import "ProductDetailViewController.h"
  2 
  3 //这里引入在第二步中,我们创建的对象
  4 #import "ResourceContainer.h"
  5 
  6 @implementation DetailViewController
  7 @synthesize imageURL = _imageURL;
  8 @synthesize originalIndexArray = _originalIndexArray;
  9 @synthesize originalOperationDic = _originalOperationDic;
 10 @synthesize requestImageQueue = _requestImageQueue;
 11 
 12 
 13 - (void)viewDidLoad
 14 
 15 {
 16 
 17      [super viewDidLoad];
 18      NSOperationQueue *tempQueue = [[NSOperationQueue alloc] init];
 19 
 20      self.requsetImageQueue = tempQueue;
 21      [tempQueue release];
 22 
 23       NSMutableArray *array = [[NSMutableArray alloc] init];
 24 
 25       self.originalIndexArray = array;
 26       [array release];
 27 
 28        NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
 29 
 30        self.originalOperationDic = dic;
 31        [dic release];
 32 
 33 }
 34 
 35 //显示图片信息
 36 
 37 -(void)displayProductImage
 38 
 39 {
 40 
 41     NSURL *url = [NSURL URLWithString:@"http://xxx.xxx.xxx.xxx"];
 42 
 43     //这个是从器返回有图片数目,self.xxxx根据具体的场合
 44 
 45     int imageCount = [self.xxxx.imageNum intValue];
 46 
 47     for (int i=0; i<imageCount; i++) {
 48 
 49         NSString *str1 = @"这里是拼图片请求url,根据实际需求";
 50 
 51         self.imageURL = [url URLByAppendingPathComponent:str1];
 52 
 53         //根据图片号请求资源
 54 
 55         [self displayImageByIndex:i ByImageURL:self.productImageURL];
 56 
 57     }
 58 
 59 }
 60 
 61 //根据图片序号显示请求图片资源
 62 
 63 -(void) displayImageByIndex:(NSInteger)index ByImageURL:(NSURL *)url
 64 
 65 {
 66 
 67     NSString *indexForString = [NSString stringWithFormat:@"%d",index];
 68 
 69     //若数组中已经存在该图片编号,说明图片加载完毕,直接返回
 70 
 71     if ([self.originalIndexArray containsObject:indexForString]) {
 72 
 73          return;
 74 
 75     }
 76 
 77     //创建UIImageView对象
 78 
 79     UIImageView *imageView = [[UIImageView alloc] init];
 80 
 81     imageView.tag = index;
 82 
 83     //创建资源请求对象
 84 
 85     ResourceContainer  *imageOperation = [[ResourceContainer alloc] init];
 86 
 87     imageOperation.resourceURL = url;
 88 
 89     imageOperation.hostObject = self;
 90 
 91     //设置收到图片信息处理理方法
 92 
 93     imageOperation.resourceDidReceive = @selector(imageDidReceive:);
 94 
 95     imageOperation.imageView = imageView;
 96 
 97     [imageView release];
 98 
 99     //将图片请求对象加入图片请求队列中
100 
101     [self.requsetImageQueue addOperation:imageOperation];
102 
103     [self.originalOperationDic setObject:imageOperation forKey:indexForString];
104 
105     [imageOperation release];
106 
107 }
108 
109 //处理图片请求返回信息
110 
111 -(void)imageDidReceive:(UIImageView *)imageView
112 
113 {
114 
115     if (imageView == nil||imageView.image == nil) {
116 
117             imageView.image = [UIImage imageNamed:@"no-pic-300-250.png"];
118 
119      }
120 
121     //将图片信息加载到前台,self.openFlowView是我用的coverFlow,coverFlow的使用方法网上很多,自己找吧
122 
123     [self.openFlowView setImage:imageView.image forIndex:imageView.tag];
124 
125     [self.originalIndexArray addObject:[NSString stringWithFormat:@"%d",imageView.tag]];
126 
127     [self.originalOperationDic removeObjectForKey:[NSString stringWithFormat:@"%d",imageView.tag]];
128 
129 }
130 
131 - (void)dealloc
132 
133 {
134      [_requestImageQueue release];
135 
136      [_originalIndexArray release];
137 
138      [_originalOperationDic release];
139 
140      [_imageURL release];
141 
142      [super dealloc];
143 
144 }
145 
146 @end

iOS - ASI与AFN

阅读数 546

IOS图片上传 ASI

阅读数 3

iOS ASI笔记

阅读数 3

iOS ASI详解

阅读数 494

IOS 上传多张图片

阅读数 221

IOS图片上传个人总结

博文 来自: zhg1152141567
没有更多推荐了,返回首页