zoukankan      html  css  js  c++  java
  • NSOperation使用

    1.继承NSOperation

    DownLoadImageTask.h
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    @protocol DownLoadImageDelegate;//声明
    
    @interface DownLoadImageTask : NSOperation<NSURLConnectionDelegate>{
        long long totalLength;
        BOOL done;
    }
    
    @property(nonatomic,weak) id<DownLoadImageDelegate>downloadImageDelegate;
    @property(nonatomic,retain) NSMutableData *buffer;
    @property(nonatomic,retain) NSURLRequest *request;
    @property(nonatomic,retain) NSURLConnection *connection;
    
    - (id)initWithURLString:(NSString *)url;
    
    @end
    
    
    @protocol DownLoadImageDelegate
    //图片下载完成的委托
    -(void)imageDownLoadFinished:(UIImage *)img;
    //更新图片下载进度条的值
    -(void)updateDownProgress:(double) value;
    @end
    #import "DownLoadImageTask.h"
    @implementation DownLoadImageTask
    - (id)initWithURLString:(NSString *)url{
        NSLog(@"url=%@",url);
        self = [super init];
        if(self){
            self.request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
            self.buffer = [NSMutableData data];
        }
        return self;
    }
    
    //主要处理方法
    -(void)start{ //或者main
        NSLog(@"DownLoadImageTask-start");
        
        if(![self isCancelled]){
            //暂停一下
            [NSThread sleepForTimeInterval:1];
            //设置connection及其代理
            self.connection = [[NSURLConnection alloc]initWithRequest:self.request delegate:self];
            if(self.connection!=nil){
                while(!done){
                    [[NSRunLoop currentRunLoop]runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
                }
            }
        }
    }
    
    -(void)httpConnectEndWithError{
        //[self hiddenWaiting];
        NSLog(@"httpConnectEndWithError");
    }
    
    -(void)dealloc{
        self.buffer = nil;
        self.connection = nil;
        self.request = nil;
        self.downloadImageDelegate = nil;
    }
    
    #pragma NSURLConnection delegate methods
    //不执行缓存
    -(NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse{
        return nil;
    }
    
    //连接发生错误
    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
        [self performSelectorOnMainThread:@selector(httpConnectEndWithError) withObject:self waitUntilDone:NO];
        [self.buffer setLength:0];
    }
    
    //收到响应
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        if(httpResponse && [httpResponse respondsToSelector:@selector(allHeaderFields)]){
            NSDictionary *httpResponseHeaderFields = [httpResponse allHeaderFields];
            totalLength = [[httpResponseHeaderFields objectForKey:@"Content-Length"] longLongValue];
            NSLog(@"totalLength is %lld",totalLength);
        }
    }
    
    //接收数据
    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
        //NSLog(@"didReceiveData...");
        [self.buffer appendData:data];
        
        double progressValue = totalLength==0?0:((double)([self.buffer length])/(double)totalLength);
        //更新进度条值
        //[(NSObject *)self.downloadImageDelegate performSelectorOnMainThread:@selector(updateDownProgress:) withObject:[NSNumber numberWithDouble:progressValue] waitUntilDone:NO];//主线程中执行代理方法
        [self.downloadImageDelegate updateDownProgress:progressValue];
    }
    
    //下载完毕
    -(void)connectionDidFinishLoading:(NSURLConnection *)connection{
        done = YES;
        UIImage *img = [[UIImage alloc] initWithData:self.buffer];
        //[(NSObject *)self.downloadImageDelegate performSelectorOnMainThread:@selector(imageDownLoadFinished:) withObject:img waitUntilDone:NO];
        [self.downloadImageDelegate imageDownLoadFinished:img];
    }
    
    -(BOOL)isConcurrent {
        //返回yes表示支持异步调用,否则为支持同步调用
        return YES;
        
    }
    
    - (BOOL)isExecuting{
        return self.connection == nil;
    }
    
    - (BOOL)isFinished{
        return self.connection == nil;
    }
    
    @end

    2.在ViewController中调用NSOperation子类

    ViewController.h

    #import <UIKit/UIKit.h>
    #import "DownLoadImageTask.h"
    
    @interface ViewController:UIViewController<DownLoadImageDelegate>
    
    @property(strong,nonatomic)NSOperationQueue *queue;
    @property(strong,nonatomic)UIImageView *appImgView;
    
    @property (strong,nonatomic)UIImage *image1;
    @property (strong,nonatomic)UIImage *image2;
    
    @end

    ViewController.m

    #import "ViewController.h"
    #import "DownLoadImageTask.h"
    
    typedef void (^downLoad1)();
    @interface ViewController()
    
    @property (nonatomic,strong)downLoad1 downloadBlock;
    
    @end
    
    @implementation ViewController
    
    #pragma mark - LoadView
    -(void)loadView{
        //初始化视图
        [self initViews];
        
        //显示等待框
        [self showWaiting];
        NSString *url = @"http://hiphotos.baidu.com/newwen666666/pic/item/01ec7750863e49600cf3e3cc.jpg";
        DownLoadImageTask *task = [[DownLoadImageTask alloc]initWithURLString:url];
        task.downloadImageDelegate = self;
        //task.operationId = index++;
        
        self.queue = [[NSOperationQueue alloc]init];
        [self.queue addOperation:task];
    
    }
    
    //初始化视图组件
    -(void)initViews{
        CGRect frame = [UIScreen mainScreen].applicationFrame;
        UIView *appView = [[UIView alloc]initWithFrame:frame];
        self.view = appView;
        [self.view setBackgroundColor:[UIColor colorWithWhite:1.0 alpha:1.0]];
        frame = CGRectMake(0, 0, frame.size.width, frame.size.height);
        _appImgView = [[UIImageView alloc]initWithFrame:frame];
        [self.view addSubview:_appImgView];
    }
    
    
    //展示等待框
    -(void)showWaiting{
        CGRect frame = CGRectMake(0, -20, 320, 480);
        int x = frame.size.width;
        
        int progressWidth = 150;
        int progressHeight = 32;
        frame = CGRectMake((x-progressWidth)/2, 100, progressWidth, progressHeight);
        UIProgressView *progress = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar];
        progress.frame = frame;
        progress.progress = 0.0;
        progress.backgroundColor = [UIColor whiteColor];
        
        UILabel *showValue = [[UILabel alloc]init];
        frame = showValue.frame;
        frame.origin.x = CGRectGetMaxX(progress.frame)+10;
        frame.origin.y = CGRectGetMinY(progress.frame);
        frame.size.width = 80;
        frame.size.height = 15;
        showValue.frame = frame;
        showValue.backgroundColor = [UIColor redColor];
        showValue.text = @"0.0";
        
        int progressIndWidth = 32;
        int progressIndHeight = 32;
        frame = CGRectMake((x-progressIndWidth)/2, 100+32, progressIndWidth, progressIndHeight);
        UIActivityIndicatorView *progressInd = [[UIActivityIndicatorView alloc]initWithFrame:frame];
        [progressInd startAnimating];
        progressInd.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
        
        frame = CGRectMake((x-70)/2, 100+32+32, 80, 20);
        UILabel *waitinglabel = [[UILabel alloc]initWithFrame:frame];
        waitinglabel.text = @"正在下载应用程序图片...";
        waitinglabel.textColor = [UIColor redColor];
        waitinglabel.font = [UIFont systemFontOfSize:15];
        waitinglabel.backgroundColor = [UIColor clearColor];
        
        frame = CGRectMake(0, 0, 320, 480);
        UIView *theView = [[UIView alloc]initWithFrame:frame];
        theView.backgroundColor = [UIColor blackColor];
        theView.alpha = 0.7;
        
        [progress setTag:100];
        [theView addSubview:progress];
        [showValue setTag:101];
        [theView addSubview:showValue];
        
        [theView addSubview:progressInd];
        [theView addSubview:waitinglabel];
        
        [theView setTag:110];
        [self.view addSubview:theView];
    }
    
    #pragma mark - ViewDidLoad
    
    -(void)viewDidLoad{
        NSLog(@"%@",self.view.subviews);
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(0, 0, 200, 100);
        button.center = CGPointMake(self.view.center.x,self.view.center.y +100);
        [button addTarget:self action:@selector(downloadImage:) forControlEvents:UIControlEventTouchUpInside];
        [button setTitle:@"下载图片" forState:UIControlStateNormal];
        [self.view addSubview:button];
        __weak typeof(self) weakSelf = self;
    
        self.downloadBlock = ^{
            weakSelf.appImgView.image = weakSelf.image1;
            [NSTimer scheduledTimerWithTimeInterval:2.0 target:weakSelf selector:@selector(updateImage) userInfo:nil repeats:NO];
        };
    }
    
    - (void)updateImage{
        self.appImgView.image = self.image2;
    }
    
    #pragma mark - clickAction
    - (void)downloadImage:(UIButton *)sender{
        [self downloadImages];
    }
    
    #pragma mark - DownLoadImages
    
    - (void)downloadImages {
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        // 异步下载图片
        dispatch_async(queue, ^{
            // 创建一个组
            dispatch_group_t group = dispatch_group_create();
            
            __block UIImage *image1 = nil;
            __block UIImage *image2 = nil;
            
            // 关联一个任务到group
            dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                // 下载第一张图片
                NSString *url1 = @"http://car0.autoimg.cn/upload/spec/9579/u_20120110174805627264.jpg";
                image1 = [self imageWithURLString:url1];
            });
            
            // 关联一个任务到group
            dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                // 下载第一张图片
                NSString *url2 = @"http://hiphotos.baidu.com/lvpics/pic/item/3a86813d1fa41768bba16746.jpg";
                image2 = [self imageWithURLString:url2];
            });
            
            // 等待组中的任务执行完毕,回到主线程执行block回调
            dispatch_group_notify(group, dispatch_get_main_queue(), ^{
                self.image1 = image1;
                self.image2 = image2;
                self.downloadBlock();
                // 千万不要在异步线程中自动释放UIImage,因为当异步线程结束,异步线程的自动释放池也会被销毁,那么UIImage也会被销毁
            });
        });
    }
    
    
    - (UIImage *)imageWithURLString:(NSString *)urlString {
        NSURL *url = [NSURL URLWithString:urlString];
        NSData *data = [NSData dataWithContentsOfURL:url];
        // 这里并没有自动释放UIImage对象
        return [[UIImage alloc] initWithData:data];
    }
    
    #pragma mark - DownLoadImageDelegate methods
    //展示下载完毕的图片
    -(void)imageDownLoadFinished:(UIImage *)img{
        //退出等待框
        [self hiddenWaiting];
        [self.appImgView setImage:img];
        NSLog(@"%@",self.view.subviews);
        
    }
    
    //更新进度条的值
    -(void)updateDownProgress:(double) value{
        UIProgressView *progresss = (UIProgressView *)[self.view viewWithTag:100];
        UILabel *showValue = (UILabel*)[self.view viewWithTag:101];
        progresss.progress = value;
        showValue.text = [NSString stringWithFormat:@"%.1f%%",(double)(value*100)];
    }
    
    //隐藏等待框
    -(void)hiddenWaiting{
        [[self.view viewWithTag:110]removeFromSuperview];
    }
    
    - (void)viewDidUnload
    {
        [super viewDidUnload];
        // Release any retained subviews of the main view.
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }
    
    @end
  • 相关阅读:
    js设计模式-工厂模式(XHR工厂)
    js设计模式-工厂模式(抽象工厂)
    javascript设计模式-工厂模式(简单工厂)
    转载【梦想天空(山边小溪)】Web 开发人员和设计师必读文章推荐【系列二十九】
    转载【H:JL】用大家的力量来总结一个目录(众人拾柴火焰高)
    javascript设计模式-单体模式
    javascript设计模式-掺元类
    javascript设计模式-继承
    开博第一天
    iOS开发 在某个视图控制器中 隐藏 状态栏
  • 原文地址:https://www.cnblogs.com/yyzanll/p/4647430.html
Copyright © 2011-2022 走看看