zoukankan      html  css  js  c++  java
  • <HTTP>HttpDownload的实现(ASIHTTP和NSConnection两种方式)

    ASIHTTPRequest是第三方包,使用前需要导入的包:MobileCoreServicesSystemConfigurationCFNetworklibz。

    这里写的HttpDownload类可以实现用参数选择两种方式中一种来实现HTTP下载。并且通过callMethod函数实现回调。

    下面是HttpDownload.h

    #import <Foundation/Foundation.h>
    #import "ASIHTTPRequest.h"
    #define DOWNLOAD_SYSTEM 1
    #define DOWNLOAD_ASIHTTPREQUEST 2
    
    @interface HttpDownload : NSObject<ASIHTTPRequestDelegate,NSURLConnectionDataDelegate>
    {
        //回调的方法
        SEL callMethod;
        //代理
        id delegate;
        NSURLConnection *mConnection;
        NSInteger mType;
        //用于存放下载到的二进制数据
        NSMutableData *mData;
    }
    @property (nonatomic,retain) NSMutableData *mData;
    
    -(void)downloadFromUrl:(NSString *)url delegate:(id)delegate selector:(SEL)selector type:(NSInteger)type;
    
    @end

    下面是HttpDownload.m

    m
    #import "HttpDownload.h"
    @implementation HttpDownload
    @synthesize mData;
    //在初始化函数中为mData分配空间
    -(id)init
    {
        if (self=[super init]) {
            mData=[[NSMutableData alloc] init];
        }
        return self;
    }
    //dealloc时对mData进行内存回收
    -(void)dealloc
    {
        self.mData=nil;
        [super dealloc];
    }
    //参数一表示下载地址,参数二表示回调对象地址,参数3表示回调函数地址,参数四是下载类型
    -(void)downloadFromUrl:(NSString *)url delegate:(id)newdelegate selector:(SEL)selector type:(NSInteger)type
    {
        delegate=newdelegate;
        callMethod=selector;
        //关于类型的宏定义
        // #define DOWNLOAD_SYSTEM 1
        // #define DOWNLOAD_ASIHTTPREQUEST 2
        if (type==DOWNLOAD_ASIHTTPREQUEST) {
            ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]];
            request.delegate=self;
            //启动异步下载
            [request startAsynchronous];
            //后面继续执行requestfinish或者requestFail方法
        }
        else if(type==DOWNLOAD_SYSTEM){
            if (mConnection) {
                [mConnection cancel];
                [mConnection release];
            }
            mConnection=[[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]] delegate:self];
            //后面执行connection:系列函数
        }
        else{
            NSLog(@"暂没实现");
        }
    }
    //得到回应,即将开始开始接收数据时
    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        //清空mData
        [mData setLength:0];
    }
    //得到数据时
    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        //将数据存到mData
        [mData appendData:data];
    }
    
    -(void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        //检查代理是否可用以及是否实现方法callMethod
        if(delegate && [delegate respondsToSelector:callMethod]){
            //调用对象delegate的方法callMethod传的参数为self
            [delegate performSelector:callMethod withObject:self];
            //下面这个不能用,因为成员变量delegate是id类型的。
            //[delegate callMethod:self];
        }
    }
    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
        NSLog(@"系统下载失败");
    
    }
    -(void)requestFinished:(ASIHTTPRequest *)request
    {
        [mData setLength:0];
        [mData appendData:[request responseData]];
        //检查代理是否可用以及是否实现方法callMethod
        if(delegate && [delegate respondsToSelector:callMethod]){
            //调用对象delegate的方法callMethod传的参数为self
            [delegate performSelector:callMethod withObject:self];
            //[delegate callMethod:self];
        }
    }
    -(void)requestFailed:(ASIHTTPRequest *)request
    {
        NSLog(@"第三方下载失败");
    }
    @end
  • 相关阅读:
    [0] 需求管理工具CaliberRM
    [0] 自动化测试工具QTP
    [0] UML建模工具(StarUML)
    [0] C# 扩展方法(Extension Method)
    [0] 统一软件过程(RUP)
    [0] XP敏捷开发
    关于ES6的let,const与var之间的三生三世
    lumen手记:自定义Validate表单验证
    window下python安装pip,切换为国内阿里云镜像
    Lumen开发:简单实现auth用户认证
  • 原文地址:https://www.cnblogs.com/robinkey/p/2760612.html
Copyright © 2011-2022 走看看