iOS UI21_多线程

//
//  MyOperation.m
//  UI21_多线程
//
//  Created by dllo on 15/8/26.
//  Copyright (c) 2015年 zhozhicheng. All rights reserved.
//

#import "MyOperation.h"

@implementation MyOperation

-(void)main
{
    NSInteger count = 1;
    for (NSInteger i = 0; i<600000000; i++) {
        count ++;
    }
    NSLog(@"%ld",count);
}
@end
//
//  ViewController.m
//  UI21_多线程
//
//  Created by dllo on 15/8/26.
//  Copyright (c) 2015年 zhozhicheng. All rights reserved.
//

#import "ViewController.h"
#import "MyOperation.h"
#import "MBProgressHUD.h"
#import "AFNetworking.h"

@interface ViewController ()
@property(nonatomic,retain)UIButton *button;
@property(nonatomic,retain)UIImageView *imageView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.button = [UIButton buttonWithType:UIButtonTypeSystem];
    self.button.frame = CGRectMake(100, 100, 150, 50);
    [self.button setTitle:@"测试" forState:UIControlStateNormal];
    self.button.layer.borderWidth = 1;
    self.button.layer.cornerRadius = 10;
    [self.view addSubview:self.button];
    [self.button addTarget:self action:@selector(GCDAction:) forControlEvents:UIControlEventTouchUpInside];

    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 200, 150, 150)];
    self.imageView.backgroundColor = [UIColor cyanColor];
    [self.view addSubview:self.imageView];
    [_imageView release];

    NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    self.imageView.image =image;

//    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
//    hud.labelText = @"正在下载.....";
    //设置样式
//    hud.mode = MBProgressHUDModeDeterminate;
    //创建一个请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://help.adobe.com/archive/en/photoshop/cs6/photoshop_reference.pdf"]];
    AFHTTPRequestOperation *
    operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    //指定一个文件的保存路径,放到沙河的caches文件里
    NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesPath =sandBox[0];
    //拼接文件路径
    NSString *pdfPath = [cachesPath stringByAppendingPathComponent:@"test.pdf"];
    NSLog(@"%@",pdfPath);
    //把文件下载到指定的文件夹路径内,写成相应的文件名
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:pdfPath append:NO];
    //通过AF进行下载
    //这是下载进度的一个block,里面会返回当前的下载进度,在这个block里设置hud的进度显示
//    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
//        hud.progress = (1.0) * (totalBytesRead) / totalBytesExpectedToRead;
//    }];
    //当下载结束之后,控制进度的hud应该消失,所以我们通过af进行下载完成的进度判断
//    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
//        NSLog(@"下载成功");
//        //移除hud
//        [hud removeFromSuperview];
//    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//        NSLog(@"%@",error);
//        [hud removeFromSuperview];
//    }];
    //把任务添加到队列里
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation];
}
-(void)click:(UIButton *)button
{
   //线程卡死
    NSInteger count = 0;
    for (NSInteger i = 0; i<100000; i++) {
        count++;
        NSLog(@"%ld",count);
    }
    NSLog(@"%ld",count);
}
#pragma mark 第一种解决线程问题的方法 NSObject提供的方法
-(void)NSObjectThread:(UIButton *)button
{
    [self performSelectorInBackground:@selector(click:) withObject:button];
    //优点:写法特别简单,能快速开辟一个临时的线程
    //缺点:不能保证线程使用时候的数据安全

}
#pragma mark 第二种方式 NSThread
-(void)NSTHreadAction:(UIButton *)button
{
    //NSThread本身就是一个线程类,他可以控制线程休眠或者创建
    //当前的主线程
    NSLog(@"%@",[NSThread currentThread]);
    //主线程休眠三秒
    [NSThread sleepForTimeInterval:3];
    NSLog(@"111111");
    //如果用NSThread创建对象,创建出来的就是新的线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(click:) object:nil];
    //可以给新的线程对象起名
    thread.name = @"zhangyangyang";
    //启动子线程
    [thread start];
    //优点:可以直接通过创建方式来控制线程
    //缺点:什么都需要手动设置,包括名,开始,太麻烦
}
#pragma mark 第三种 NSOperation 任务
-(void)operationAtion:(UIButton *)button
{
//    NSOperation是一个抽象类,如果想使用这个抽象类,必须要创建一个他的子类

    MyOperation *operation = [[MyOperation alloc] init];
    [operation start];
    //他不能单独拿出来使用,如果单独使用和之前不考虑线程方式是一样的会卡死主线程,他一般和MyOperationQueue配合使用

}
-(void)operationQueue:(UIButton *)button
{
    //默认和任务一起配合使用解决多线程问题

    //队列:队列中通过一个线程池来管理所有闲置的线程,这样可以提高线程的重用利用率,避免重复创建线程,整合资源
    //优点:内部不需要关心线程的安全问题,用起来相对简单
    //缺点:效率稍微有点低

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //设置最大并发数
    [queue setMaxConcurrentOperationCount:2];
    MyOperation *op1 = [[MyOperation alloc] init];
    MyOperation *op2 = [[MyOperation alloc] init];
    MyOperation *op3 = [[MyOperation alloc] init];
    MyOperation *op4 = [[MyOperation alloc] init];
    MyOperation *op5 = [[MyOperation alloc] init];
    //把任务加到队列
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];
    [queue addOperation:op4];
    [queue addOperation:op5];

}
-(void)GCDAction:(UIButton *)button
{
//    //GCD是苹果提供的一种处理多线程的解决方案,整体比较好,和operationQueue两种是常见的解决线程问题的方法
//    //这个方法可以保证无论哪个线程执行都只执行一次
//    static dispatch_once_t oneToKen;
//    dispatch_once(&oneToKen, ^{
//
//    });
//    //自定义一个队列
//    //第一个参数:给队列起一个名(C语言字符串,不加@)  第二个参数:设置队列并行
//    //DISPATCH_QUEUE_CONCURRENT并行队列
//    dispatch_queue_t myQueue = dispatch_queue_create("zhangyangyang", DISPATCH_QUEUE_CONCURRENT);
//    //接下来,可以在队列执行一些任务
//    dispatch_async(myQueue, ^{
//        NSInteger count = 0;
//        for (NSInteger i = 0; i<60000; i++) {
//            count++;
//        }
//        NSLog(@"%ld",count);
//    });

   ////////
    //网络请求一般会在子线程里进行加载,但是显示这个数据都在主线程里进行,所以需要把请求的数据放到主线程使用
    //定义一个全局的队列
    //第一个参数:设置当前队列优先
    //第二个参数:没有实际含义,留给以后用
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //再获取一下当前的主队列,也就是主线程
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    //通过异步进行数据请求
    dispatch_async(globalQueue, ^{
        //通过网址请求图片数据
        NSString *picStr = @"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg";
        NSURL *url =[NSURL URLWithString:picStr];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        //把请求下来的数据到主线程进行刷新
        dispatch_async(mainQueue, ^{
            self.imageView.image = image;
        });

    });

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 07:31:50

iOS UI21_多线程的相关文章

iOS开发多线程篇—线程的状态

iOS开发多线程篇—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时

iOS开发多线程之自定义NSOperation

iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // 2 // YYViewController.h 3 // 01-自定义Operation 4 // 5 // Created by apple on 14-6-26. 6 // Copyright (c) 2014年 itcase. All rig

iOS开发多线程篇—自定义NSOperation

iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // 2 // YYViewController.h 3 // 01-自定义Operation 4 // 5 // Created by apple on 14-6-26. 6 // Copyright (c) 2014年 itcase. All rig

iOS开发多线程篇 09 —NSOperation简单介绍

iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOpe

iOS开发多线程篇 05 —GCD介绍

iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中

iOS开发多线程篇—多线程简单介绍

iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程

iOS开发多线程篇—多线程的的相关概念(1)

iOS开发多线程篇-多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活动监视器"可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行

iOS开发--多线程 并行开发

概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程

iOS中多线程基本概念

进程与线程 什么是进程? 近程是指在系统中正在运行的一个应用程序. 每个近程之间是独立的,每个近程均运行在其专用且受保护的内存空间内. **可以通过“活动监视器”可以查看Mac系统中所有开启的进程. 什么是线程? 一个进程要想执行任务,必须得有线程(每一个进程至少要有一条线程). 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行. 线程的串行 一个线程中任务的执行是串行(顺序执行的) 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务. 也就是说,在同一时间内