学习小结9

本文记录了作者九周的技术学习历程,强调了持续进步的重要性,并分享了在网络下载中实现断点续传的经验。通过设置网络请求、处理下载进度、暂停与恢复下载流程,展示了技术学习与实践相结合的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     一转眼秋天都到了,外面下着雨,叶子也开始落了。

     好了,说正题,学习已经九周了,一天一天的积累,学到的东西也蛮多的,学如逆水行舟,所以,只要坚持每天都前进一点,过一段时间就会发现自己已经学了很多东西,前进了很长一段路。而且技术没有捷径,孰熟能生巧,练习的多了就会懂得其中的奥妙。

     前天学了网络下载的断点与续传,值得分享。


#import "ViewController.h"


@interface ViewController ()<NSURLConnectionDataDelegate>

{

    BOOL isDownLoad;//标记是否正在下载

    NSMutableData *receiveData;//接收到的数据

    double total;//要下载数据的总大小

    double recevieTotal;//已经接收到的数据的大小

    NSString *_filePath;//文件写入的路径

    

    NSURLConnection *_connection;//网络请求的对象

}

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    NSLog(@"%@---沙盒",NSHomeDirectory());

//    

   //--取得下载数据的大小

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];//(注:NSUserDefaults是单例)

    recevieTotal = [[userDefaults objectForKey:@"RecevieTotal"]doubleValue];

    total = [[userDefaults objectForKey:@"Total"]doubleValue];

    

    //显示上一次下载的进度

    if (total > 0) {

        CGFloat progress = recevieTotal / total;

//        NSLog(@"jindu====%.3f",progress);

        self.progress.progress = progress;

        self.label.text = [NSString stringWithFormat:@"%.2f%%",progress * 100];

    }

    

    

}


#pragma mark -暂停

- (IBAction)stopClick:(UIButton *)sender {

    //断点--

    //--取消下载连接

    if (isDownLoad == YES) {

        [_connection cancel];

    _connection = nil;

    

    //--将缓冲数据写入文件

    [self writeToFile:receiveData];

    

    //-本地保存下载文件的大小和总文件大小

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    [userDefaults setObject:@(recevieTotal) forKey:@"RecevieTotal"];

    [userDefaults setObject:@(total) forKey:@"Total"];

    

    //将数据同步写入文件

    [userDefaults synchronize];

    

    isDownLoad = NO;

    [self.btn setTitle:@"点击下载" forState:UIControlStateNormal];

    }

    

    

}


#pragma mark -开始下载

- (IBAction)asynRequst:(id)sender {

    if (!isDownLoad) {

        [sender setTitle:@"正在下载" forState:UIControlStateNormal];

         //1.

         NSURL *url = [NSURL URLWithString:@"http://free2.macx.cn:8182/tools/play/qqmusic30b5.dmg"];

        

        //2.构建request

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

        //*****设置断点续传

        if (recevieTotal > 0) {

            //设置继续下载的位置

            NSString *value = [NSString stringWithFormat:@"bytes=%d-",(int)recevieTotal];

            

            [request setValue:value forHTTPHeaderField:@"Range"];

        }

//

        

        //3.发送异步请求

        _connection = [NSURLConnection connectionWithRequest:request delegate:self];

        isDownLoad = YES;

        

        

        //获取字符串

        NSString *urlString = url.absoluteString;

        

        //获取urlString的最后一部分

        NSString *fileName = [urlString lastPathComponent];

        //写入文件

       _filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", fileName];

        

        //***判断文件是否存在,如果不存在,则创建

        if (![[NSFileManager defaultManager]fileExistsAtPath:_filePath]) {

        

            //-创建文件

            [[NSFileManager defaultManager]createFileAtPath:_filePath contents:nil attributes:nil];

        }

        

    }

   

    

}



#pragma mark -收到响应

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response

{

    receiveData = [[NSMutableData alloc]init];

    //*****判断总大小是否为0,如果为0,则表示是从起始位置开始下载,需要获取文件的总大小

    

    if (total == 0) {

        //获取所有的响应头

        NSDictionary *fileds = response.allHeaderFields;

        

        //获取数据的总大小

        NSNumber *length = [fileds objectForKey:@"Content-Length"];

        total = [length doubleValue];

        

        

    }

//    

//    //获取所有的响应头

//    NSDictionary *fields = response.allHeaderFields;

//    

//    //获取数据的总长度

//    NSNumber *length = [fields objectForKey:@"Content-Length"];

//    

//    total = [length doubleValue];

////    NSLog(@"%.2f---total",total/1000 / 1000);

}



#pragma mark -接受到数据

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

{

    recevieTotal += data.length;

    double progress = recevieTotal / total;

    

    self.progress.progress = progress;

    self.label.text = [NSString stringWithFormat:@"%.2f%%",progress * 100];

    

    [receiveData appendData:data];


    

    if (receiveData.length > 200 * 1000) {

        [self writeToFile:receiveData];

        [receiveData setData:nil];

    }

    

}


#pragma mark -数据接受完毕

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

{

//    NSURL *url = [connection currentRequest].URL;

//    

//    //获取字符串

//    NSString *urlString = url.absoluteString;

//    

//    //获取urlString的最后一部分

//    NSString *fileName = [urlString lastPathComponent];

//    //写入文件

//    NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", fileName];

//

//    [receiveData writeToFile:filePath atomically:1];

    if (receiveData.length <= 200 * 1000) {

        [self writeToFile:receiveData];

        [receiveData setData:nil];

    }

    isDownLoad = NO;

    

    [self.btn setTitle:@"点击下载" forState:UIControlStateNormal];

}



#pragma mark -写入数据

- (void)writeToFile:(NSData *)data

{

    if (data.length == 0) {

        return;

    }

    

    NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:_filePath];

    [handle seekToEndOfFile];

    [handle writeData:data];

    

    [handle closeFile];

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值