ios用asi怎么上传系统搜狐相册照片上传失败

及旗下全部分类
iOS开发教程之ASIHTTPRequest:使用download cache
发布人:&&发布日期: 13:57&&共2205人浏览
来源:网络 作者:未知
本文为大家介绍了iOS开发ASIHTTPRequest使用download cache的内容,其中包括cache策略,存储策略,其他cache相关的特性,编写自己的cache等等内容。
从1.8版本开始,ASIDownloadCache和ASICacheDelegate的API改变了,你可能需要修改你的代码。
尤其是,cache策略的可用选项发生了改变,你现在可以对单一request使用结合的cache策略
ASIHTTPRequest可以自动缓存下载的数据,在很多情况下这很有用。
当你离线时,你无法再次下载数据,而你又需要访问这些数据
从上次下载这些数据后,你只想在数据更新后才下载新的数据
你处理的数据永远不会发生改变,所以你只想下载一次数据
在之前版本的ASIHTTPRequest里,遇到上述情况,你只能自己处理这些策略。在一些情况下,使用download cache可以让你不用再写本地缓存机制。
ASIDownloadCache 是个简单的URL cache,可以用来缓存GET请求的相应数据。一个request要被缓存,它首先必须请求成功(没有发送错误),服务器必须返回200HTTP状态值。或者,从1.8.1版本开始,301,302,303,307重定向状态码都可以。
要打开响应值的cache机制很简单:
[ASIHTTPRequest&setDefaultCache:[ASIDownloadCache&sharedCache]];&
这样做以后,所有的request都会自动使用cache。如果你愿意,你可以让不同的request使用共享的cache:
ASIHTTPRequest&*request&=&[ASIHTTPRequest&requestWithURL:url];&
[request&setDownloadCache:[ASIDownloadCache&sharedCache]];&
你不会被局限于使用单一的cache,你可以想创建多少cache就创建多少cache,只要你喜欢 ^ ^。当你自己创建一个cache,你必须设定cache的路径&&这路径必须是一个你拥有写权限的目录。
ASIDownloadCache&*cache&=&[[[ASIDownloadCache&alloc]&init]&autorelease];&
[cache&setStoragePath:@&/Users/ben/Documents/Cached-Downloads&];&
//别忘了&-&你必须自己retaining你自己的cache!&
[self&setMyCache:cache];&
ASIHTTPRequest&*request&=&[ASIHTTPRequest&requestWithURL:url];&
[request&setDownloadCache:[self&myCache]];&
cache策略是你控制cache中信息的主要方法,控制何时使用cache数据而非重新下载数据。
每个request的cache策略可是由request的cachePolicy 属性来控制的。cache策略使用掩码来定义,所以你可以二进制&与&操作他们。
//&每次都向服务器询问是否有新的内容可用,&
//&如果请求失败,&使用cache的数据,即使这个数据已经过期了&
[request&setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];&
你可以使用下列cache策略选项来控制request的缓存策略:
ASIUseDefaultCachePolicy
默认的cache 策略。请勿将这一项与其他项结合使用。当你设置一个request使用cache,它会使用cache的defaultCachePolicy. ASIDownloadCache的默认cache策略是&ASIAskServerIfModifiedWhenStaleCachePolicy&.&
ASIDoNotReadFromCacheCachePolicy
使用这一项,request将不会从cache中读取数据
ASIDoNotWriteToCacheCachePolicy
使用这一项,request将不会把数据存入cache
ASIAskServerIfModifiedWhen
StaleCachePolicy
这是ASIDownloadCaches的默认cache策略。使用这个策略时,request会先查看cache中是否有可用的缓存数据。如果没有,request会像普通request那样工作。
如果有缓存数据并且缓存数据没有过期,那么request会使用缓存的数据,而且不会向服务器通信。如果缓存数据过期了,request会先进行GET请求来想服务器询问数据是否有新的版本。如果服务器说缓存的数据就是当前版本,那么缓存数据将被使用,不会下载新数据。在这种情况下,cache的有效期将被设定为服务器端提供的新的有效期。如果服务器提供更新的内容,那么新内容会被下载,并且新的数据以及它的有效期将被写入cache。
ASIAskServerIfModifiedCachePolicy
这一项与ASIAskServerIfModifiedWhenStaleCachePolicy相同,除了一点:request将会每次都询问服务器端数据是否有更新。
ASIOnlyLoadIfNotCachedCachePolicy
使用这一项,cache数据将一直被使用,无视过期时间
ASIDontLoadCachePolicy
使用这一项时,只有当响应数据有缓存时,request才会成功。如果一个request没有缓存的响应数据,那么这个request将会停止,并且不会有错误设置在request上。
ASIFallbackToCacheIf
LoadFailsCachePolicy
当使用这一项时,当request失败时,request会回头请求cache数据。如果请求失败后,request使用的cache数据,那么这个request会成功(没有错误)。你通常会将这一项与其他项结合使用,因为它适用于指定当发生错误时request的行为。
当你设定了一个cache对象的defaultCachePolicy 属性,所有使用这个cache对象的request都会使用这个cache策略,除非你为request设置了另外的策略。
存储策略允许你定义一个cache可以存储特定的相应数据多久。ASIHTTPRequest目前支持两种存储策略:
ASICacheForSessionDurationCacheStoragePolicy是默认值。相应数据只会在会话期间被存储,在第一次使用cache时,或者在调用&[ASIHTTPRequest clearSession]时,数据会被清除。
使用ASICachePermanentlyCacheStoragePolicy,缓存的相应数据会被永久存储。要使用这个存储策略,向request设置:
ASIHTTPRequest&*request&=&[ASIHTTPRequest&requestWithURL:url];&
[request&setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];&
要手动清除cache,调用函数clearCachedResponsesForStoragePolicy:,传入要清除的cache数据的存储策略:
[[ASIDownloadCache&sharedCache]&clearCachedResponsesForStoragePolicy:ASICachePermanently
CacheStoragePolicy];&
其他cache相关的特性
//&当你关闭&shouldRespectCacheControlHeaders,cache对象会存储响应数据,而无视&
//&服务器的显式&请勿缓存&声明&(例如:cache-control&或者pragma:&no-cache&头)&
[[ASIDownloadCache&sharedCache]&setShouldRespectCacheControlHeaders:NO];&
//&可以设定request的secondsToCache来覆盖服务器设定的内容有效期,&这时,响应数据&
//&会一直被缓存,直到经过secondsToCache秒&
ASIHTTPRequest&*request&=&[ASIHTTPRequest&requestWithURL:url];&
[request&setSecondsToCache:60*60*24*30];&//&缓存30&天&
//当request开始执行后,如果响应数据是从缓存中取得的,didUseCachedResponse&会返回YES&
[request&didUseCachedResponse];&
//&向cache对象索取一个路径来存储相应数据.&这是使用download&cache的最有效率的方法,&
//&因为此时,当request完成后,数据不需要被复制到cache中.&
[request&setDownloadDestinationPath:&
&&&[[ASIDownloadCache&sharedCache]&pathToStoreCachedResponseDataForRequest:request]];&
编写自己的cache
如果你已经持有一个download cache并且想将他插入ASIHTTPRequest中,或者你喜欢自己写自己的download cache,那么让你的cache实现ASICacheDelegate协议。
我的电子书iOS上传照片_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
iOS上传照片
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
你可能喜欢iOS开发网络篇—简单介绍ASI框架的使用 - 文顶顶 - 博客园
我对岁月俯首,对星辰致意
iOS开发网络篇&简单介绍ASI框架的使用
说明:本文主要介绍网络编程中常用框架ASI的简单使用。
一、ASI简单介绍
ASI:全称是ASIHTTPRequest,外号&HTTP终结者&,功能十分强大。
ASI的实现基于底层的CFNetwork框架,因此运行效率很高。可惜作者早已停止更新,有一些潜在的BUG无人去解决
ASI的github地址
ASI的使用参考
二、ASI的使用
  下载并导入ASI框架,注意该框架依赖于Reachability.
  导入框架后,如果编译的话会出现一大堆的错误。其中一个最主要的原因是因为该框架是非ARC的。
  思考:如果一个框架,其中很多文件都是非ARC的,那么应该如何进行设置?
  在这里,介绍最傻瓜的一种方法,通过进行如下的一些设置以解决问题。(注意:对于所有的asi框架中得文件都需要进行此番设置)
  设置完成后,还存在一些错误。产生这些错误的原因是ASI框架它依赖于下面的几个框架,把需要的框架添加后再编译,就不会有问题了。
  添加依赖的框架:
把所需的三个框架逐个添加到项目中
2发送网络请求(同步和异步*GET和POST请求)
示例程序代码:
1 #import "YYViewController.h"
2 #import "ASIHTTPRequest.h"
3 #import "ASIFormDataRequest.h"
5 @interface YYViewController ()&ASIHTTPRequestDelegate&
6 @property(nonatomic,strong)ASIHTTPRequest *
10 @implementation YYViewController
12 - (void)viewDidLoad
[super viewDidLoad];
17 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//同步请求
[self sync];
//异步请求
[self async1];
[self post];
27 #pragma mark-发送post请求
28 -(void)post
//1.创建网络请求(POST)
NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/login"];
ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
//2.添加请求参数(请求体中得参数)
[request setPostValue:@"123" forKey:@"username"];
[request setPostValue:@"123" forKey:@"pwd"];
//3.发送请求
[request startAsynchronous];
[request setStartedBlock:^{
NSLog(@"该方法会覆盖代理方法中得对应方法");
48 -(void)dealloc
50 #warning 当控制器销毁的时候,清除并取消代理
[self.request clearDelegatesAndCancel];
//如果是非arc的环境,那么还需要清空请求
//self.request=N
56 #pragma mark-异步请求
异步请求的第一种方式:设置代理,用代理方法监听
60 -(void)async1
//1.创建网络请求(GET)
NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/login?username=123&pwd=123"];
self.request=[ASIHTTPRequest requestWithURL:url];
//设置网络请求的延时为10秒钟
self.request.timeOutSeconds=10;
//2.设置代理
self.request.delegate=
//3.发送请求(异步请求)
[self.request startAsynchronous];
76 #pragma mark-异步请求的代理方法
77 //请求开始的时候调用
78 -(void)requestStarted:(ASIHTTPRequest *)request
82 //接收到服务器返回的数据时调用(数据量比较大的时候,这个方法会被调用多次,每次只能拿到部分数据)
83 -(void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data
87 //请求结束的时候调用(在该方法中拿到最终的数据)
88 -(void)requestFinished:(ASIHTTPRequest *)request
//request.responseData:服务器返回的所有数据,这个data已经拼接了接收到的所有数据
92 //发送网络请求失败的时候调用
93 -(void)requestFailed:(ASIHTTPRequest *)request
异步请求的第二种方式:selector,以设置代理为基本前提
100 -(void)async2
//1.创建网络请求(GET)
NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/login?username=123&pwd=123"];
self.request=[ASIHTTPRequest requestWithURL:url];
//设置网络请求的延时为10秒钟
self.request.timeOutSeconds=10;
//2.设置代理
self.request.delegate=
//通过selector的方法,当请求开始的时候,由请求的代理即控制器调用start方法进行监听
//说明:该方法会覆盖代理方法
[self.request setDidStartSelector:@selector(start)];
//3.发送请求(异步请求)
[self.request startAsynchronous];
119 -(void)start
NSLog(@"该方法会覆盖代理方法中得对应方法");
异步请求的第三种方式:使用block回调
127 -(void)async3
//1.创建网络请求(GET)
NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/login?username=123&pwd=123"];
self.request=[ASIHTTPRequest requestWithURL:url];
//设置网络请求的延时为10秒钟
self.request.timeOutSeconds=10;
//2.使用block回调监听
[self.request setStartedBlock:^{
//请求开始的时候调用
[self.request setFailedBlock:^{
//请求失败的时候调用
[self.request setDataReceivedBlock:^(NSData *data) {
//开始接收数据的时候调用
[self.request setCompletionBlock:^{
//请求成功完成的时候调用
//3.发送请求(异步请求)
[self.request startAsynchronous];
154 #pragma mark-同步请求
155 -(void)sync
//1.创建网络请求(GET)
NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/login?username=123&pwd=123"];
ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
//设置网络请求的延时为10秒钟
request.timeOutSeconds=10;
//2.发送请求(同步请求)
[request startSynchronous];
//3.检测服务器返回的结果
if (request.error) {//请求出错,比如超时
NSLog(@"请求超时,错误信息为%@",request.error);
}else//请求成功
//打印状态码和状态信息
NSLog(@"状态码---%d,状态信息---%@",request.responseStatusCode, request.responseStatusMessage);
//打印返回的数据的长度
NSLog(@"返回数据的长度--%d",request.responseData.length);
//将返回的数据转换为字符串
NSLog(@"返回的数据---%@",request.responseString);
//将服务器返回的数据解析为字典
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:request.responseData options:NSJSONReadingMutableLeaves error:Nil];
NSLog(@"%@",dictionary);
程序说明:
(1)同步发送请求打印的消息
(2)异步发送请求
ASI以异步的方式发送网络请求有三种方式,第一种是通过代理进行监听;第二种方法是通过block进行监听。还有一种方法时使用selector,这是建立在设置代理的基础之上的,调用的方法会覆盖代理方法。
第一种方法:
异步请求的第一种方式:设置代理,用代理方法监听
4 -(void)async1
//1.创建网络请求(GET)
NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/login?username=123&pwd=123"];
self.request=[ASIHTTPRequest requestWithURL:url];
//设置网络请求的延时为10秒钟
self.request.timeOutSeconds=10;
//2.设置代理
self.request.delegate=
//3.发送请求(异步请求)
[self.request startAsynchronous];
20 #pragma mark-异步请求的代理方法
21 //请求开始的时候调用
22 -(void)requestStarted:(ASIHTTPRequest *)request
26 //接收到服务器返回的数据时调用(数据量比较大的时候,这个方法会被调用多次,每次只能拿到部分数据)
27 -(void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data
31 //请求结束的时候调用(在该方法中拿到最终的数据)
32 -(void)requestFinished:(ASIHTTPRequest *)request
//request.responseData:服务器返回的所有数据,这个data已经拼接了接收到的所有数据
36 //发送网络请求失败的时候调用
37 -(void)requestFailed:(ASIHTTPRequest *)request
第二种方法:
异步请求的第二种方式:selector,以设置代理为基本前提
4 -(void)async2
//1.创建网络请求(GET)
NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/login?username=123&pwd=123"];
self.request=[ASIHTTPRequest requestWithURL:url];
//设置网络请求的延时为10秒钟
self.request.timeOutSeconds=10;
//2.设置代理
self.request.delegate=
//通过selector的方法,当请求开始的时候,由请求的代理即控制器调用start方法进行监听
//说明:该方法会覆盖代理方法
[self.request setDidStartSelector:@selector(start)];
//3.发送请求(异步请求)
[self.request startAsynchronous];
23 -(void)start
NSLog(@"该方法会覆盖代理方法中得对应方法");
第三种方法:
异步请求的第三种方式:使用block回调
4 -(void)async3
//1.创建网络请求(GET)
NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/login?username=123&pwd=123"];
self.request=[ASIHTTPRequest requestWithURL:url];
//设置网络请求的延时为10秒钟
self.request.timeOutSeconds=10;
//2.使用block回调监听
[self.request setStartedBlock:^{
//请求开始的时候调用
[self.request setFailedBlock:^{
//请求失败的时候调用
[self.request setDataReceivedBlock:^(NSData *data) {
//开始接收数据的时候调用
[self.request setCompletionBlock:^{
//请求成功完成的时候调用
//3.发送请求(异步请求)
[self.request startAsynchronous];
提示:block是ios4之后才引入的技术。
这两种方法各有优缺点
说明:如果要同时发送多个请求,他们都设置控制器为自己的代理,这样需要进行一些必要的判断。而如果各自都是有block这样的方式的话,那么将不会存在这些问题,多个请求之间相互不存在干扰。
  新的问题:如果又有block又设置了代理,那么情况是什么样子的呢?
  答案是block和相关的代理方法都会被调用。
  提示:ASI中已经考虑到了线程安全的问题。
3.发送POST请求。
注意需要包含一个头文件
内部默认就是POST的。
注意add和set的区别,一个是添加(适用于多值参数),一个是覆盖(内部先remove,再add)。
服务器接收到的请求信息:
随笔 - 163
评论 - 116409:55 提问
iOS主流是用什么第三方上传高清图片?AFN?ASI?Base64?
iOS主流是用什么第三方上传高清图片?AFN?ASI?Base64?那一种比较好一点,速度快,简单高效
按赞数排序
base64只是一种编码格式
AFNetwork 和 ASI 才是开源的网络请求组件
如果说使用简单的话
推荐AFNetwork,不过2.0版本只支持iOS7+
base64不太适合用来对图片编码,因为图片太大了,base64一般对文字数据进行编码
额,我一般直接就用afn上传,图片压缩下就行
其他相似问题
相关参考资料asihttprequest上传图片 - The important thing in life is to have a great aim ,and the determination to attain it!
-- Freeman - ITeye技术网站
博客分类:
NSURL *url =@"yourURL";
ASIFormDataRequest*currentRequest =[ASIFormDataRequest requestWithURL:url];
[currentRequest setPostFormat:ASIMultipartFormDataPostFormat];[currentRequest setRequestMethod:@"POST"];
[currentRequest addData:imgData withFileName:@"file" andContentType:@"image/png" forKey:@"yourFileNameOnServer"];//This would be the file name which is accepting image object on server side e.g. php page accepting file
[currentRequest setDelegate:self];
[currentRequest setDidFinishSelector:@selector(uploadImageFinished:)];
[currentRequest setDidFailSelector:@selector(uploadImageFailed:)];
[currentRequest startSynchronous];
-(void)uploadImageFinished:(ASIHTTPRequest*)request
//Your request successfully executed. Handle accordingly.
-(void)uploadImageFailed:(ASIHTTPRequest*)request
{//Your request failed to execute. Handle accordingly.
dcj3sjt126com
浏览: 601847 次
来自: 北京
像你最后一句话:批注:至于为什么会有/assets/b729a ...
very helpful...

我要回帖

更多关于 qq群相册无法上传照片 的文章

 

随机推荐