`
stephen830
  • 浏览: 3011659 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ASIHTTPRequest使用过程中遇到的问题及解决办法

阅读更多

 

ASIHTTPRequest使用过程中遇到的问题及解决办法

 

久仰ASIHTTPRequest大名,在决定使用ASIHTTPReques之前已经阅读了它的使用文档( 请参考:http://allseeing-i.com/ASIHTTPRequest/ ),文档写的很详细,感觉使用起来应该没有什么大问题了,可是到真正开发编程时,还是遇到了一些问题,有一些细节并没有体现在它的文档里(或者是我没看到 -_-#),我在这里简单的归纳总结一下:
1.  如何把ASIHTTPRequest添加到自己的ios工程里
  关于这一点官方的文档已经有详细的说明,我把它列出来只是为了方便日后参考。
  首先需要把源码里的文件引用到现有工程,如果只是用到基础功能的话,只需引用下图所示的文件:



 

然后需要添加CFNetwork, SystemConfiguration, MobileCoreServices, CoreGraphics 和 zlib这些framework,以及libz.1.2.3.dylib,添加方法如下图:



 

详细的配置文档请参考:http://allseeing-i.com/ASIHTTPRequest/Setup-instructions
2.  使用ASINetworkQueue下载出错
  我的下载队列大概有十几个图片,在我确保网络连接没有问题的情况下,每次[queue go]之后总有一两张图片下载失败,这个问题困扰了我很久,不知道问题出在哪里。我的queue的配置如下:

[mNetworkQueue reset];
    [mNetworkQueue setDownloadProgressDelegate:progressIndicator];
    [progressIndicator release];
    [mNetworkQueue setRequestDidFinishSelector:@selector(converFetchComplete:)];
    [mNetworkQueue setRequestDidFailSelector:@selector(converFetchFailed:)];
    [mNetworkQueue setShowAccurateProgress:YES];
    [mNetworkQueue setDelegate:self];
    [mNetworkQueue setQueueDidFinishSelector:@selector(converQueueComplete:)];

 

 

之后经过反复的调试,我发现是setShowAccurateProgress这个方法引起的,如果不配置这个方法,下载过程就不会出错。但是我的用法是参考了ASIHTTPRequest官方的sample的用法,应该没有什么区别(参考:QueueViewController.m)。虽然问题解决了,但是导致下载失败的根本原因没有搞清楚,回头再看看源码,找到问题的根源再来更新。
3.  setDownloadDestinationPath 不会自动创建路径
  之前用[SSZipArchive unzipFileAtPath:targetPath toDestination:destinationPath]的时候如果目标路径不存在会自动创建,想当然的以为ASIHTTPRequest的setDownloadDestinationPath方法也回自动创建,事实证明这种想法是错误的,如果目标路径不存在会导致request失败。解决方法是在 设置之前先判断目标路径是否存在,不存在就手动创建好,参见如下代码:

 

if (![[NSFileManager defaultManager] fileExistsAtPath:[targetPath stringByDeletingLastPathComponent]])
    {
        [[NSFileManager defaultManager]
            createDirectoryAtPath:[targetPath stringByDeletingLastPathComponent]
            withIntermediateDirectories:YES attributes:nil error:nil];      
    }

 

 

4.  用ASIHTTPRequest下载文件,如果请求的url不存在,不会报告错误
  用ASIHTTPRequest下载文件时,如果请求的文件不存在,并不会触发requestFailed,它会下载一个描述错误的文本文件保存到目标路径,用文本编辑器打开后如下所示:



 

 

这个文件描述的是404错误,这种情况下怎么判断我下载的文件是否是我真正要下载的呢,解决方法是在setRequestDidFinishSelector指定的selector中加入404状态的判断,代码如下:

 

- (void)converFetchComplete:(ASIHTTPRequest *)request
{
    NSLog(@"request name is %@", [request.userInfo objectForKey:@"name"]);
    if( [request responseStatusCode] == 404 )// 判断是否发生404错误
    {
        NSLog(@"the requested url was not found!!");
        if ([[NSFileManager defaultManager] fileExistsAtPath:request.downloadDestinationPath]) {
            [[NSFileManager defaultManager] removeItemAtPath:request.downloadDestinationPath error:NULL];
        }
    }
}

 

注:其中converFetchComplete为我指定的setRequestDidFinishSelector。
5.  需要注意的有关内存回收的问题
  关于这一点,ASIHTTPRequest的官方文档中有提到一些:Requests don’t retain their delegates, so if there’s a chance your delegate may be deallocated while your request is running, it is vital that you clear the request’s delegate properties. In most circumstances, if your delegate is going to be deallocated, you probably also want to cancel request, since you no longer care about the request’s status.
  官方给出的代码示例如下:

 

// Ddealloc method for our controller
- (void)dealloc
{
   [request clearDelegatesAndCancel];
   [request release];
   ...
   [super dealloc];
}

 

这里只说明了request回收的问题,如果是ASINetworkQueue的话也存在同样的内存回收的问题,解决方法如下:

 

// Ddealloc method for our controller
- (void)dealloc
{
    // request 回收
    [mRequest clearDelegatesAndCancel];
    [mRequest release];
    // networkQueue 回收
    [mNetworkQueue reset];
    [mNetworkQueue release];
   ...
   [super dealloc];
}

 

以上为我最近在使用ASIHTTPRequest时遇到的问题,以后再碰到ASIHTTPRequest相关的问题我会不断在此更新。

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 210.3 KB
  • 大小: 73.1 KB
  • 大小: 156.1 KB
分享到:
评论

相关推荐

    ASIHttpRequest

    - 同步请求:虽然不推荐在主线程中使用同步请求,因为会阻塞用户界面,但ASIHTTPRequest也支持同步请求,通过`-[ASIHTTPRequest startSynchronous]`方法可以实现。通常在后台线程中使用同步请求。 3. 集成与使用 ...

    ASIHTTPRequest

    在本文中,我们将深入探讨ASIHTTPRequest的核心特性、使用方法和常见应用场景。 1. **核心特性** - **异步请求**:ASIHTTPRequest支持异步HTTP请求,这意味着在请求进行时,应用程序可以继续执行其他任务,提高...

    ASIHTTPRequest使用介绍

    2. **ASIFormDataRequest**:继承自 ASIHTTPRequest,专门处理POST请求,简化了参数提交过程。 3. **ASINetworkQueue**:继承自 NSOperationQueue,用于管理多个请求,实现批量处理,保持执行顺序。 4. **...

    asihttprequest带demo代码包

    在“asihttprequest带demo代码包”中,你将找到一个示例项目,它可以帮助你理解和使用 ASIHTTPRequest 库。 1. **请求发起**: - ASIHTTPRequest 支持 GET、POST、PUT、DELETE 等多种 HTTP 方法。 - 可以通过 `-...

    ASIHttpRequest ios开发框架

    开发者可以通过阅读源码来了解其实现原理,也可以直接将库导入到自己的项目中使用。不过,由于ASIHttpRequest已不再活跃更新,建议在新项目中考虑使用更现代的网络库,以获得更好的兼容性和性能。

    asihttprequest使用指南

    ### ASIHTTPRequest使用指南知识点详解 #### 一、概述与背景 ASIHTTPRequest是iOS开发中一个流行的第三方网络请求库,其设计目标是为了简化HTTP请求的处理过程,提供了一个直观且功能丰富的API,使得开发者能够...

    ASIHTTPRequest网络API

    4. 在需要使用ASIHTTPRequest的源文件中,导入头文件`#import "ASIHTTPRequest.h"`。 关于Git官方示例,它可能包含了一些使用ASIHTTPRequest的代码示例,这些示例展示了如何发起GET和POST请求,处理响应,设置请求...

    ASIHTTPRequest的使用方法

    本文将深入探讨如何使用ASIHTTPRequest进行网络通信。 首先,创建一个同步请求是最基础的操作。在Objective-C中,可以创建一个ASIHTTPRequest对象,通过`requestWithURL:`方法指定请求的URL。然后,通过`...

    ASIHTTPRequest使用指南中文版

    ### ASIHTTPRequest 使用指南知识点详解 #### 一、概述 ASIHTTPRequest是Objective-C社区中一个非常流行的库,用于处理HTTP请求。它简化了许多常见的网络任务,如GET和POST请求,并支持上传文件、处理证书等复杂...

    ASIHTTPRequest断点续传

    在ASIHTTPRequest中,实现断点续传的步骤如下: 1. **保存下载进度**:当下载开始时,ASIHTTPRequest会检查本地是否存在先前的下载数据。如果存在,它将读取已下载文件的大小,这是通过检查文件的长度来实现的。 2...

    ASIHTTPRequest 源码

    3. **请求队列管理**:ASIHTTPRequest提供请求队列,可以将多个请求放入队列中,按顺序执行,避免同时发起过多请求导致的性能问题。 4. **缓存机制**:支持自动缓存响应数据,提高数据获取速度,减少网络带宽使用。...

    ASIHTTPRequest+UITableView实现多个下载任务

    在ASIHTTPRequest中,可以通过setShouldResumeDownloads:YES来开启断点续载功能,并配合使用requestDidResume和requestDidStopNotification通知来监控下载状态。 在UITableView中,我们可以为每个下载任务创建一个...

    ASIHttpRequest 库中文手册

    ### ASIHttpRequest库中文手册知识点解析 #### 一、ASIHttpRequest库简介 ##### 1. 概述 ASIHttpRequest库是一款用于iOS应用开发中的HTTP请求处理工具,它为开发者提供了简单易用的API来实现HTTP请求相关的功能。...

    ASIHTTPRequest框架

    同时,它也支持同步请求,适合在后台线程中使用,避免阻塞主线程。 2. **文件上传与下载**:框架内建了文件上传功能,可以通过POST或PUT方法将本地文件内容发送到服务器。同时,它支持断点续传,即使在下载过程中...

    ASIHTTPRequest使用指南(中文版)

    ### ASIHTTPRequest使用指南知识点详解 #### 一、概述与背景 ASIHTTPRequest是Objective-C下的一款流行的网络请求库,主要用于iOS和OS X平台上的HTTP请求处理。它简化了网络请求的过程,提供了同步和异步请求的...

    ASIHTTPRequest AFNetworking和MKNetworkKit的使用

    对于那些希望向后兼容,或者已经在使用ASIHTTPRequest但需要解决现有问题的项目,可以考虑逐步迁移到其他两个库。 综上所述,ASIHTTPRequest、AFNetworking和MKNetworkKit各有优劣,开发者需要结合自身项目的特性和...

Global site tag (gtag.js) - Google Analytics