文档章节

用协议封装好的 常用的request connection

依然_范特西_
 依然_范特西_
发布于 2015/01/23 14:57
字数 539
阅读 6
收藏 0


#import <Foundation/Foundation.h>

@class QfHttpRequest;


@protocol QfHttpRequestDelegate <NSObject>

//请求完成

- (void)qfHttpRequestDidFinish:(QfHttpRequest*)request Data:(NSData*)data;

//请求失败

- (void)qfHttpRequestDidFailed:(QfHttpRequest*)request;


@end


@interface QfHttpRequest : NSObject<NSURLConnectionDataDelegate>{

    NSMutableData* _mData;

}


//外界传来的url,需要进行请求

@property (nonatomic, assign) int tag;

@property (nonatomic, copy) NSString* url;

@property (nonatomic, assign) id<QfHttpRequestDelegate> delegate;


//开始请求

- (void)startRequest;



@end



#import "QfHttpRequest.h"


@implementation QfHttpRequest


- (void)dealloc{

    [_mData release];

    [super dealloc];

}


- (id)init{

    if (self = [super init]) {

        _mData = [[NSMutableData alloc] init];

    }

    return self;

}


- (void)startRequest{

    NSURL* url = [NSURL URLWithString:self.url];

    //请求

    NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30.0];

    //开始请求

    [NSURLConnection connectionWithRequest:request delegate:self];

}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

    [_mData appendData:data];

}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    [self.delegate qfHttpRequestDidFinish:self Data:_mData];

}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    [self.delegate qfHttpRequestDidFailed:self];

}




@end



//在其他类中使用的时候先遵守协议 

#import "ViewController.h"

#import "NSString+Hashing.h"


@implementation ViewController


- (void)viewDidLoad

{

    [super viewDidLoad];


    _dataArray = [[NSMutableArray alloc] init];

    

    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, 320, 460)];

    _tableView.delegate = self;

    _tableView.dataSource = self;

    [self.view addSubview:_tableView];

    [_tableView release];

    

    //开始请求

    QfHttpRequest* request = [[QfHttpRequest alloc] init];

    request.url = @"http://www.aibaishu.com/2.xml";

    request.tag = 1000;

    request.delegate = self;

    [request startRequest];

}


//qfHttpRequest delegate

//请求完成

- (void)qfHttpRequestDidFinish:(QfHttpRequest *)request Data:(NSData *)data{

    if (request.tag == 1000) {

        NSString* xmlStr = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];

        //解析xml

        GDataXMLDocument* doc = [[GDataXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];

        GDataXMLElement* rootEle = [doc rootElement];

        NSArray* houseArray = [rootEle elementsForName:@"houseinfo"];

        for (GDataXMLElement* houseInfo in houseArray) {

            HouseItem* house = [[HouseItem alloc] init];

            house.houseid = [[[houseInfo elementsForName:@"houseid"] lastObject] stringValue];

            house.title = [[[houseInfo elementsForName:@"title"] lastObject] stringValue];

            house.titlephoto = [[[houseInfo elementsForName:@"titlephoto"] lastObject] stringValue];

            [_dataArray addObject:house];

            [house release];

        }

        [_tableView reloadData];

    } else {

        UIImage* image = [UIImage imageWithData:data];

        NSIndexPath* indexPath = [NSIndexPath indexPathForRow:request.tag inSection:0];

        HouseCell* cell = (HouseCell*)[_tableView cellForRowAtIndexPath:indexPath];

        cell.titlePhoto.image = image;

        

        //保存到缓存

        NSString* path = [NSHomeDirectory() stringByAppendingFormat:@"/tmp/%@",[request.url MD5Hash]];

        [data writeToFile:path atomically:NO];

    }

    [request release];

}


//请求失败

- (void)qfHttpRequestDidFailed:(QfHttpRequest *)request{

    NSLog(@"请求失败");

    [request release];

}


//tableView delegate

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 47;

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return _dataArray.count;

}


- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    HouseCell* cell = [tableView dequeueReusableCellWithIdentifier:@"ID"];

    if (cell == nil) {

        cell = [[[HouseCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ID"] autorelease];

    }

    

    HouseItem* house = [_dataArray objectAtIndex:indexPath.row];

    cell.titleLabel.text = house.title;

    cell.titlePhoto.image = nil;

    

    //先从缓存找

    NSString* path = [NSHomeDirectory() stringByAppendingFormat:@"/tmp/%@",[house.titlephoto MD5Hash]];

    //判断这个路径是否为真

    NSFileManager* fm = [NSFileManager defaultManager];

    NSLog(@"%@",path);

    if ([fm fileExistsAtPath:path]) {

        //如果为真,证明有缓存,直接从缓存读取

        NSData* data = [NSData dataWithContentsOfFile:path];

        UIImage* image = [UIImage imageWithData:data];

        cell.titlePhoto.image = image;

    } else {

        //否则的话,证明没缓存,下载并做缓存

        QfHttpRequest* request = [[QfHttpRequest alloc] init];

        request.tag = indexPath.row;

        request.url = house.titlephoto;

        request.delegate = self;

        [request startRequest];

    }


    return cell;

}


© 著作权归作者所有

上一篇: C语言部分总结--1
下一篇: 进程和线程
依然_范特西_
粉丝 1
博文 5
码字总数 5427
作品 0
焦作
私信 提问
OKHttp源码分析1 - 框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013510838/article/details/52424637 1 OKHttp介绍 网络库一直是Android APP开发中至关重要的库,关系到加载...

谢杨易
2016/09/03
0
0
获取网络数据的两种方法 简单示例

#pragma mark-- #pragma mark 按键响应函数 //1.用get方法上传参数、获取数据 - (IBAction)getMsgWithGet:(id)sender { NSString *baseUrl=@"http://getMsgWithGet.php"; NSString *withStri......

木木情深
2014/02/28
117
0
ios网络编程(http、socket)

http编程综述:亦可称为soap编程。通常情况下,http编程要比socket编程相对要简单易用得多。所以用的最广广泛。 一、http编程其实就是http请求。http请求最长用的方法是 get 和 post 方法。 ...

木木情深
2014/02/28
6.6K
0
UI_17 网络编程

一、网络基础 1、URL URL的全称是Uniform Resource Locator(统一资源定位符) URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL URL的基本格式 = 协议://主机地址/路径 http...

黑伞将军
2015/09/08
50
0
vscode插件快餐教程(4) - 语言服务器协议lsp

vscode插件快餐教程(4) - 语言服务器协议lsp 语言服务器协议lsp是vscode为了解决语言扩展中的痛点来实现的一套协议。如下图所示: 总体说来,在有lsp之前,存在三个主要问题: 一是语言相关的...

lusing
05/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
21分钟前
2
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
32分钟前
2
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
33分钟前
2
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
39分钟前
6
0
IDEA 自定义方法注解模板

IDEA 自定义方法注解模板 1、使用效果 /*** 计算交易费用* @Author wangjiafang* @Date 2019/9/11* @param feeComputeVo* @return*/@PostMapping("/v1/fee_compute")public ApiResp......

小白的成长
39分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部