zoukankan      html  css  js  c++  java
  • NSOperation 的使用(下载相关) 图片和文件都是能够的 断点续传 图片逐渐显示









    //
    //  ImageDownloader.h
    //  NSOperationTest
    //
    //  Created by ydc on 11-10-29.
    //  Copyright 2011年 __MyCompanyName__. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @protocol imageDownloaderDelegate;
    
    @interface ImageDownloader : NSOperation 
    {
        NSURLRequest* _request;
        
        NSURLConnection* _connection;
        
        NSMutableData* _data;
        
        BOOL _isFinished;
        
        BOOL _cancelled;
    }
    
    - (id)initWithURLString:(NSString *)url;
    
    @property(readonly) NSData *data;
    @property(nonatomic, assign) id<imageDownloaderDelegate> delegate;
    @property(nonatomic, strong) NSObject *delPara;
    @property(nonatomic, strong) NSRecursiveLock *cancelledLock;
    
    
    @end
    
    @protocol imageDownloaderDelegate
    
    @optional
    
    //图片下载完毕的托付
    - (void)imageDidFinished:(UIImage *)image para:(NSObject *)obj;
    
    @end
    


    //
    //  ImageDownloader.m
    //  NSOperationTest
    //
    //  Created by ydc on 11-10-29.
    //  Copyright 2011年 __MyCompanyName__. All rights reserved.
    //
    
    #import "ImageDownloader.h"
    
    
    @implementation ImageDownloader
    
    
    
    - (id)initWithURLString:(NSString *)url 
    {
        
        self = [self init];
        if (self) {
            assert(url != nil);
            _request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
            _data = [NSMutableData data];
        }
        return self;
    }
    
    - (void)start {
        
        if (![self isCancelled]) {
            
            [NSThread sleepForTimeInterval:3];
            // 以异步方式处理事件,并设置代理
            
            _connection=[NSURLConnection connectionWithRequest:_request delegate:self];
            
            while(_connection != nil) {
                
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];   
                
            }
            
        }
        
    }
    
    #pragma mark NSURLConnection delegate Method
    
    // 接收到数据(增量)时
    
    - (void)connection:(NSURLConnection*)connection
        didReceiveData:(NSData*)data
    {
        [_data appendData:data];
        if (self.delegate != nil){
            UIImage *img = [[UIImage alloc] initWithData:self.data] ;
            [_delegate imageDidFinished:img para:self.delPara];
        }
    }
    
    - (void)connectionDidFinishLoading:(NSURLConnection*)connection {
        if (self.delegate != nil)
        {
            UIImage *img = [[UIImage alloc] initWithData:self.data] ;
            [_delegate imageDidFinished:img para:self.delPara];
        }
        _connection=nil;
    }
    
    -(void)connection: (NSURLConnection *) connection didFailWithError: (NSError *) error
    {
        _connection=nil;
    }
    - (void)cancelOnRequestThread
    {
        [[self cancelledLock] lock];
        if ([self isCancelled]) {
    		[[self cancelledLock] unlock];
    		return;
    	}
        [self willChangeValueForKey:@"isCancelled"];
        _cancelled = YES;
        [self didChangeValueForKey:@"isCancelled"];
        
        [[self cancelledLock] unlock];
    }
    - (BOOL)isCancelled
    {
        BOOL result;
        
    	[[self cancelledLock] lock];
        result = _cancelled;
        [[self cancelledLock] unlock];
        
        return result;
    }
    -(BOOL)isConcurrent
    {
        return YES;
    }
    - (BOOL)isExecuting
    {
        return _connection == nil; 
    }
    - (BOOL)isFinished
    {
        return _connection == nil;  
    }
    
    @end
    

    @property (strong, nonatomic)NSOperationQueue *queue;


     NSString *newUrl = [NSString stringWithFormat:@"http://static2.dmcdn.net/static/video/666/645/43546666:jpeg_preview_source.jpg?%d",(int)[NSDate timeIntervalSinceReferenceDate]];
        ImageDownloader *imageDownloader = [[ImageDownloader alloc]initWithURLString:newUrl];
        imageDownloader.delegate = self;
        [self.queue addOperation:imageDownloader];

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.urlConnection = [NSURLConnection connectionWithRequest:request delegate:self];
        }];


    下载文件断点续传

    NSMutableURLRequest *fileRequest = [NSMutableURLRequest requestWithURL:self.downloadURL
                                                                   cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                               timeoutInterval:kFileDefaultTimeout];
    假设文件存在则 断点续传

    _startFileSize = [[fm attributesOfItemAtPath:self.pathToFile error:nil] fileSize];
            NSString *range = [NSString stringWithFormat:@"bytes=%lld-", _startFileSize];
            [fileRequest setValue:range forHTTPHeaderField:@"Range"];

    然后启动下载
      _connection = [[NSURLConnection alloc] initWithRequest:fileRequest
                                                      delegate:self
                                              startImmediately:NO];
        if (self.connection) {
            [self.connection scheduleInRunLoop:[NSRunLoop mainRunLoop]
                                       forMode:NSDefaultRunLoopMode];
            [self willChangeValueForKey:@"isExecuting"];
            [self.connection start];
            [self didChangeValueForKey:@"isExecuting"];
        }



  • 相关阅读:
    常用AIX论坛地址介绍
    向日葵任务甘特图 http://www.51diaodu.cn/
    centos 中tomcat加入自启动​【转】
    徐州出差几天
    Unit OneC
    周末来了~
    北京展览馆参加第6届石油石化装备展览会
    王心凌 我会好好的 cyndi with u
    VS中Debug与Release、_WIN32与_WIN64的区别
    c语言中<stdbool.h>的使用
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4036958.html
Copyright © 2011-2022 走看看