IOS线程进阶

来源:互联网 发布:茅台防伪溯源软件 编辑:程序博客网 时间:2024/05/22 16:01

IOS线程学习

NSThread创建

//类对象创建

NSThread* thread = [[NSThreadalloc]initWithTarget:selfselector:@selector(first)object:nil];

    [threadstart];

2

//类加方法直接创建

    [NSThreaddetachNewThreadSelector:@selector(second)toTarget:selfwithObject:nil];

    [selfperformSelectorInBackground:@selector(third)withObject:nil];

3系统方法

  [selfperformSelectorOnMainThread:@selector(func)withObject:nilwaitUntilDone:NO];



二.多线程进阶

NSOperation&NSOperationQueue

很多时候我们使用多线程,需要控制线程的并发数,毕竟线程也是消耗系统资源的,当程序中同时运行的线程过多时,系统必然变慢。 所以很多时候我们会控制同时运行线程的数目。

NSOperation可以封装我们的操作,然后将创建好的NSOperation对象放到NSOperationQueue中,OperationQueue便开始启动新的线程去执行队列中的操作,OperationQueue的并发度是可以通过如下方式进行设置:

  1. - (void)setMaxConcurrentOperationCount:(NSInteger)count 

- (void)operation{

    //操作队列

    NSOperationQueue *queue=[[NSOperationQueue alloc]init];

    //最大并行数量

    queue.maxConcurrentOperationCount=3;

    for (int i=1; i<11; i++) {

        MyOperation *operation=[[MyOperation alloc]init];

        operation.time=i;

        //添加到队列

        [queue addOperation:operation];

        [operation release];

    }

}

#import <Foundation/Foundation.h>

@interface MyOperation : NSOperation

@property (nonatomic, assign)int time;

@end

#import "MyOperation.h"

@implementation MyOperation

//

- (void)main{

    

    sleep(self.time);

    NSLog(@"%d",self.time);

}

@end

GCD

GCD是Grand Central Dispatch的缩写,是一系列的BSD层面的接口,在Mac 10.6 和iOS4.0以后才引入的,且现在NSOperation和NSOperationQueue的多线程的实现就是基于GCD的。目前这个特性也被移植到 FreeBSD上了,可以查看libdispatch这个开源项目。

比如一个在UIImageView中显示一个比较大的图片

  1. #import "ViewController.h"

    @implementation ViewController

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

        button.frame = CGRectMake(100, 230, 100, 30);

        [button setTitle:@"标题" forState:UIControlStateNormal];

        [button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:button];

        

        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(110, 10, 100, 200)];

        [self.view addSubview:_imageView];

    }

    - (void)buttonClick{

        //[self gcd];

        //[self gcdGroup];

        

        dispatch_async(dispatch_get_global_queue(0, 0), ^{

            NSURL* url = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/news/pic/item/f3d3572c11dfa9ecde69b09e60d0f703908fc1f0.jpg"];

            NSData* data = [NSData dataWithContentsOfURL:url];

            NSLog(@"下载完成");

            UIImage* image = [UIImage imageWithData:data];

            //主线程

            dispatch_async(dispatch_get_main_queue(), ^{

                _imageView.image = image;

            });

        });

    }

    - (void)gcdGroup{

        //创建组

        dispatch_group_t t = dispatch_group_create();

        dispatch_group_async(t, dispatch_get_global_queue(0, 0), ^{

            [self first];

        });

        dispatch_group_async(t, dispatch_get_global_queue(0, 0), ^{

            [self second];

        });

        dispatch_group_async(t, dispatch_get_global_queue(0, 0), ^{

            [self third];

        });

        dispatch_group_notify(t, dispatch_get_global_queue(0, 0), ^{

            NSLog(@"执行完成");

        });

    }

    - (void)gcd{

        dispatch_queue_t t = dispatch_queue_create(NULL, NULL);

        //想成在t线程里执行block里面的语句

        dispatch_async(t, ^{

            [self first];

        });

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            [self second];

        });

    }

    - (void)first{

        sleep(1);

        NSLog(@"1");

    }

    - (void)second{

        sleep(2);

        NSLog(@"2");

    }

    - (void)third{

        sleep(3);

        NSLog(@"3");

    }

    @end


0 0