//
// Request.m
// Lucia
//
// Created by sike on 13-6-6.
// Copyright (c) 2013年 sike. All rights reserved.
//
#import "Request.h"
#import "ASIFormDataRequest.h"
@interface Request()<ASIHTTPRequestDelegate>
@property (nonatomic,strong) NSMutableArray *requestArray; //请求数组
@end
@implementation Request
- (void)dealloc{
for(ASIFormDataRequest *request in self.requestArray){
[request clearDelegatesAndCancel];
}
}
- (void)cancelCurrentRequest
{
if (_currentRequest) {
[_currentRequest clearDelegatesAndCancel];
}
}
//取消网络链接
- (void)cancelDelegates{
for(ASIFormDataRequest *request in self.requestArray){
[request clearDelegatesAndCancel];
}
}
//初始化
- (id)init
{
if (self = [super init]) {
self.requestArray = [NSMutableArray array];
}
return self;
}
//异步请求方式
- (void)startRequestMethod:(NSString *)url //请求url
params:(NSDictionary *)params //参数
fieldParams:(NSDictionary *)fieldParams //文件参数
requestMethod:(NSString *)method //请求方法
onCompletion:(RequestCompletionBlocks)onCompletion
onError:(RequestFailedBlocks)onError{
NSURL *splitUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@",url]]; //转化拼装的url
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:splitUrl];
_currentRequest = request;
[self.requestArray addObject:request];
for (NSString *key in [params keyEnumerator])
{
[request addPostValue:[params valueForKey:key] forKey:key];
}
//对于特殊的post请求 需要用addField
for (NSString *key in [fieldParams keyEnumerator])
{
[request addFile:[fieldParams valueForKey:key] forKey:key];
}
[request setTimeOutSeconds:60.0f]; //超时设置为60秒
[request setRequestMethod:method]; //请求方式 (Post,Get,Put,Delete...)
[request setCompletionBlock:^{
if (self.isNeedJson) {
NSString *requestStr = [[NSString alloc] initWithData:[_currentRequest responseData] encoding:NSUTF8StringEncoding];
// DLog(@"requestStr :%@",requestStr);
NSError *error = nil;
id jsonObject = [NSJSerialization JSONObjectWithData:[requestStr dataUsingEncoding:NSUnicodeStringEncoding] options:NSJSONReadingMutableLeaves error:&error];
if ([jsonObject isKindOfClass:[NSDictionary class]]){
NSDictionary *deserializedDictionary = (NSDictionary *)jsonObject;
onCompletion(deserializedDictionary);
} else if ([jsonObject isKindOfClass:[NSArray class]]){
NSArray *deserializedArray = (NSArray *)jsonObject;
onCompletion(deserializedArray);
} else {
NSLog(@"An error happened while deserializing the JSON data.");
}
}else{
NSData *getData = [_currentRequest responseData];
onCompletion(getData);
}
[self.requestArray removeObject:_currentRequest];
}];
[request setFailedBlock:^{
[self.requestArray removeObject:_currentRequest];
onError(_currentRequest.error);
}];
[request startAsynchronous];
}
@end
解决方案:
现在有一个由网易工程师维护的一个ASIHttpRequest分支版本,修复了asi在ios7下的内存泄露问题。 https://github.com/OpenFibers/asi-http-request