多线程

这里写图片描述

ViewController.m
#import "ViewController.h"
#import "MyOperation.h"
#import "MBProgressHUD.h"
#import "AFNetworking.h"
@interface ViewController ()

@property(nonatomic, retain)UIImageView *imageView;

@end

@implementation ViewController

- (void)dealloc
{
    [_imageView release];
    [super dealloc];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

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


UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(100, 100, 150, 50);
    [self.view addSubview:button];
    button.backgroundColor = [UIColor greenColor];
    [button setTitle:@"测试" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(GCDAction:) forControlEvents:UIControlEventTouchUpInside];
- (void)clickAction:(UIButton *)button {
    // 模拟线程卡死
    // 线程卡死就是当前主线程被一个耗时的运算占用,占用的过程不能对应用进行任何的操作.
    NSInteger count = 0;
    for (NSInteger i = 0; i < 9999999999; i++) {
        count ++;
        NSLog(@"%ld", count);
    }
}

// 多线程第一种:NSObject提供的方法.
- (void)NSObjectAction:(UIButton *)button {
    [self performSelectorInBackground:@selector(clickAction:) withObject:button];

    // 优点:方法特别简单,而且是NSObject得方法,都有这个方法.
    // 缺点:对线程没有任何的管理,没有考虑线程上的安全.
}

- (void)NSThreadAction:(UIButton *)button {
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(clickAction:) object:nil];

    // 这个类主要就是用来管理线程.
    // 可以给这个线程起一个名字.
    thread.name = @"student";
    // 找到主线程.
//    [thread main];

    // 让当前的线程休眠几秒之后在执行.
//    [NSThread sleepForTimeInterval:3];
//    NSLog(@"****");

    // 如果让他完成线程操作,必须动手去设置开始
    [thread start];

    // 有点:可以快速的创建线程,而且能对线程进行休眠操作,
    // 缺点:什么都需要自己设置,比较麻烦,也没关注线程安全.
}

// 多线程的第三种:NSOperationQueue
- (void)NSOperationAction:(UIButton *)button {
    MyOperation *operation = [[MyOperation alloc] init];
    [operation start];

    // 如果只用一个operation的操作的话,它默认就是在主线程里执行,所以如果想要实现通过多线程来操作的话,必须和NSOperationQueue配合使用.
}

- (void)queueAction:(UIButton *)button {
    MyOperation *operation1 = [[MyOperation alloc] init];
    MyOperation *operation2 = [[MyOperation alloc] init];
    MyOperation *operation3 = [[MyOperation alloc] init];
    MyOperation *operation4 = [[MyOperation alloc] init];
    MyOperation *operation5 = [[MyOperation alloc] init];

    // 创建一个任务的队列.
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 把任务添加到队列里.

    // 设置最大的并发数.
    // 并发数就是能同时执行几个任务.
    queue.maxConcurrentOperationCount = 1;

    // 把任务添加到队列.
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
    [queue addOperation:operation4];
    [queue addOperation:operation5];

    // 当前应用程序的主线程队列,在异步的时候用过,目的是为了告诉系统子线程的数据要传到主线程去显示和使用.
//    [NSOperationQueue mainQueue];

    // 常见的多线程的工具,有点在于能重复利用闲置的线程,避免多的重复的创建,并且内部对线程安全进行了保证,可以设置并发数.
    // 缺点:用法比较麻烦.
}

- (void)GCDAction:(UIButton *)button {
//    // GCD 是苹果提供的一种处理多线程的方法,在之前iOS使用的是NSThread的类进行线程处理,4.0之后开始使用GCD,GCD使用比较简单,但是代码稍微复杂.
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//    });
//    
//    // 通过GCD,创建一个自定义的队列.
//    // 参数1:给队列起一个名字.
//    // 参数2:设置并行队列.DISPATCH_QUEUE_CONCURRENT
//    dispatch_queue_t queue = dispatch_queue_create("lxj", DISPATCH_QUEUE_CONCURRENT);
//    
//    
//    dispatch_async(queue, ^{
//        // 需要多线程处理的内容,都写在block里
//        NSInteger count = 0;
//        for (NSInteger i = 0; i < 6000000; i++) {
//            count++;
//        }
//        NSLog(@"%ld", count);
//    });

    // 网络请求一般会在子线程里进行,但是数据需要在主线程里进行显示,所以把子线程请求的数据放到主线程.
    // 参数2:没啥用.
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    // 找到主线程,主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // 通过异步的方式进行图片的下载.
    dispatch_async(globalQueue, ^{
        // 图片的数据请求.
        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];
        // 把子线程的数据,显示在主线程的控件里
        dispatch_async(mainQueue, ^{
            self.imageView.image = image;
        });
    });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值