ASIHTTPRequest使用过程中遇到的问题及解决办法转之薄桜の霊

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

久仰ASIHTTPRequest大名,在决定使用ASIHTTPReques之前已经阅读了它的使用文档( 请参考:http://allseeing-i.com/ASIHTTPRequest/ ),文档写的很详细,感觉使用起来应该没有什么大问题了,可是到真正开发编程时,还是遇到了一些问题,有一些细节并没有体现在它的文档里(或者是我没看到 -_-#),我在这里简单的归纳总结一下:

1.  如何把ASIHTTPRequest添加到自己的ios工程里

  关于这一点官方的文档已经有详细的说明,我把它列出来只是为了方便日后参考。

  首先需要把源码里的文件引用到现有工程,如果只是用到基础功能的话,只需引用下图所示的文件:

  

  然后需要添加CFNetwork, SystemConfiguration, MobileCoreServices, CoreGraphics 和 zlib这些framework,添加方法如下图:

  

  详细的配置文档请参考: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相关的问题我会不断在此更新。

目录
相关文章
|
消息中间件 缓存 安全
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(下)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
1404 0
|
4月前
|
移动开发 JavaScript C#
分享53戏源代码总有一个是你想要的(亲测每一个均可用)
分享53戏源代码总有一个是你想要的(亲测每一个均可用)
24 0
|
6月前
|
JavaScript 前端开发 Java
前端项目里常见的十种报错及其解决办法
前端项目里常见的十种报错及其解决办法
157 0
|
9月前
|
程序员
有了这些不愁找不到对象,520表白代码
有了这些不愁找不到对象,520表白代码
49 0
|
11月前
|
小程序 Java 机器人
使用Java实现发送微信消息(附源码)_此程序在手再也不怕对象跟你闹了
此程序在手再也不怕女朋友跟你闹了!!!!自从有了女朋友比如:早安、晚安之类的问候语可不能断,但是也难免有时候会忘记那么该咋么办呢?很简单写一个程序么,近日闲来无趣想着用Java写一个自动发送微信的小程序,实现定时给指定的好友发送指定的消息,这不就很Nice了?本文主要包括实现的思路、代码的实现、打包为jar快捷方式!
112 0
|
12月前
|
SQL 安全 数据库
记一次稍微有点曲折的getshell
记一次稍微有点曲折的getshell
|
12月前
|
Python
上古代码漫游记(二):把陷阱去掉了,反倒踩进了新的陷阱?
上古代码漫游记(二):把陷阱去掉了,反倒踩进了新的陷阱?
82 0
热饭的测开成果盘点第二十三期:wqrfproxy自动抓包断言库
本期介绍的是一个组件,身为python的第三方库,已经被pypi收录,且国内镜像源也早已复制。也就是说可以通过pip install 来下载。这个组件就是:wqrfproxy ,它的作用是可以在正常的unittest脚本中,对app发出的请求进行断言。
热饭的测开成果盘点第二十三期:wqrfproxy自动抓包断言库
|
安全 Java API
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(上)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
336 0
|
安全 Java API
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(中)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
520 0