iOS多线程初步总结

来源:互联网 发布:淘宝客推广论坛 编辑:程序博客网 时间:2024/06/05 21:10

实现多线程的几种方式

一、NSObject方式实现

基于NSOBject方式的多线程是最为简单的多线程,只是需要在后台执行。

例如:

// 参数1:需要在后台(子线程)执行方法// 参数2:给这个方法传参[self performSelectorInBackground:@selector(btnUpClicked:) withObject:nil];

二、NSThread方式实现

NSThread在所有线程中是最为轻量级,可以根据需要,任意操作线程。但是,需要考虑线程安全以及锁问题。

例如:

//NSThread *thread = [NSThread detachNewThreadSelector:<#(SEL)#> toTarget:<#(id)#> withObject:<#(id)#>]NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(btnUpClicked:) object:nil];[thread start];[thread release];


自定义基于NSThread的子类,需要重写main函数,将需要的内容放入main函数中。

不管怎样,线程的启动还是需要手动控制


内存管理:

需要将对象autorelease,否则对象在其他线程中,无法得到释放。

三、NSOperation方式实现

NSOperation是一个抽象类,使用时需要写基于NSOperation的子类。系统写了两个子类

NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:<#(id)#> selector:<#(SEL)#> object:<#(id)#>]

NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{    // 填写你要执行的任务内容}];

NSOperationOperation是NSOperation的系统定义的子类,省去了继承的代码,使用该类可以方便地制定操作对象、方法。


NSOperationQueue:任务队列,负责将一系列的线程调度管理。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];// 设置最大并发数[queue setMaxConcurrentOperationCount:2];[queue addOperation:op1];[queue addOperation:op2];[queue addOperation:op3];[queue addOperation:op4];

四、GCD

GCD 是基于队列的 多线程实现方式 
队列的类型 
1.并行: 多个任务同时执行 Concurrent 
2.串行: 依次执行任务(同一事件只执行一个任务) Serial
例如:
// 自己创建一个队列// 参数1:给队列起个名字// 参数2:选择队列的类型 DISPATCH_QUEUE_CONCURRENT(串行) dispatch_queue_attr_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);// 使用队列// 参数1: 在哪个队列执行代码// 参数2: 要执行的代码dispatch_async(queue, ^{    [self btnUpClicked:nil];});

GCD定义的系统队列主要由一个串行队列和4个并行队列构成
1.  一个串行队列 作用:管理主线程的相关事务
// 获得主队列dispatch_queue_t mainQueue = dispatch_get_main_queue();// 在主队列执行任务dispatch_async(mainQueue, ^{    [self btnUpClicked:nil];});
2. 4个并行队列
// 参数1: 选择队列的优先级// 参数2: 给未来使用 一般填0dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(globalQueue, ^{    [self btnUpClicked:nil];});


==================
一些关于GCD的使用
==================

// 1.全局队列获取数据 回到主队列将数据加载到视图上dispatch_async(globalQueue, ^{       // 全局队列(子线程)获取数据    NSString *str = @"htt://www.baidu.com";    NSURL *url = [NSURL URLWithString:str];        NSData *data = [NSData dataWithContentsOfURL:url];    UIImage *image = [UIImage imageWithData:data];        // 返回主线程 加载UI/更新UI    dispatch_async(mainQueue, ^{               UIImageView *imageView = [[UIImageView alloc] init];        // 给视图赋值        imageView.image = image;            });});


// 2.一段代码只执行依次// 大部分的时候 都在单例方法中使用static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{    NSLog(@"只执行依次");});


// 3.一段代码执行多次 (全局队列有效)// 参数1: 执行多少次// 参数2: 在哪个队列有效// 参数3: 要执行的内容dispatch_apply(4, globalQueue, ^(size_t a) {    NSLog(@"%zu", a);});


// 4.定时// 参数1: 间隔几秒// 参数2: 执行的内容dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{    NSLog(@"=====");});







0 0