IOS中的线程操作(3)

使用CGD比前面两种更高效(据说是这样,有兴趣的同学可以去试试)。这也是苹果比较推荐使用的方式。

GCD是Grand Central Dispatch的缩写,是一组用于实现并发编程的C接口。GCD是基于Objective-C的Block的特性开发的,基本的业务逻辑和NSOperation很像。都是添加一个任务到一个队列,由系统来负责线程的生成和调度。因为直接使用Block,所以使用起来很是方便,降低了多线程开发的门槛.

还是前两节下载图片的例子,让我们看一下使用GCD模式该怎样做。

#import "ViewController.h"

#define IMAGE_PATH @"https://www.baidu.com/img/bdlogo.png"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *mImage;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:IMAGE_PATH]];
        UIImage *image = [[UIImage alloc] initWithData:imageData];
        //回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.mImage setImage:image];
        });
    });
}

是不是要简洁得多,GCD会自动帮我们创建消息队列,不需要我们再去手动创建和管理。

系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列,如下:

dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);   

2、关于dispatch_group_async的使用

dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group =  dispatch_group_create();
    dispatch_group_async(group, queue,^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"1.0");
    });
     dispatch_group_async(group, queue,^{
        [NSThread sleepForTimeInterval:2.0];
        NSLog(@"2.0");
    });
     dispatch_group_async(group, queue,^{
        [NSThread sleepForTimeInterval:3.0];
        NSLog(@"3.0");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"dispatch_group_async");
    });

打印结果:

2015-06-03 12:42:46.673 IOS多线程[1706:138779] 1.0

2015-06-03 12:42:47.671 IOS多线程[1706:138782] 2.0

2015-06-03 12:42:48.672 IOS多线程[1706:138787] 3.0

2015-06-03 12:42:48.672 IOS多线程[1706:138679] dispatch_group_async

3、dispatch_barrier_async

我们可以通过

dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)

方法来生成自定义的queue ,label参数,理论上是可以使用任何自定义值的,我们一般使用倒序的程序路径名。

看下面的代码:

    dispatch_queue_t queue = dispatch_queue_create("asd", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"1");
    });
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:4];
        NSLog(@"2");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"3");
    });
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"4");
    });

打印结果:

2015-06-03 13:05:37.753 IOS多线程[1989:151430] 1

2015-06-03 13:05:41.757 IOS多线程[1989:151430] 2

2015-06-03 13:05:45.763 IOS多线程[1989:151430] 3

2015-06-03 13:05:46.764 IOS多线程[1989:151430] 4

大家可以看到 打印结果是按照顺序去打印的,也就是说这是在子线程中去进行的一个串行操作,dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

时间: 2024-11-05 21:04:30

IOS中的线程操作(3)的相关文章

IOS中的线程操作(1)

IOS 上提供的多线程方法只要分为三种,1.NSThread 2.NSOperation 3.GCD ([self performSelectorInBackground:SEL withObject:id] 这个方法本质上也是一种多线程的方式),三种方式抽象程度越来越高,代码的编写难度也越来越简单. 1.NSThread: NSThread比其他两个都要更轻量级,但需要自己来管理线程的生命周期和同步,代码的编写上比其他两个复杂. NSThread提供了两种初始化方式,一种是传统的init方法

IOS中的线程操作(2)

接上一篇 2.NSOperation NSOperation是一个抽象类,本身并没有办法去直接使用,如果我们要使用它,就要去使用它的子类.IOS已经给我们提供了两个已经实现好的子类,NSInvocationOperation和NSBlockOperation. 对于这两个子类虽然IOS本身提供了start方法,不过我们一般不去直接使用它而需要借助另外一个类 NSOperationQueue . NSOperationQueue顾名思义是一个操作队列,他会给我们提供一个有序的执行队列,看一下苹果官

Java与iOS中的线程安全与线程同步

Java 中的线程安全与线程同步: 创建一个 Thread的实现类 MyThread , 作为线程体; 创建 Test 类, 在主函数中生成两个 Thread 对象, 两个对象公用一个线程体( MyThread 的对象 ); 线程安全: 避免多个线程同时访问统一资源; 解决办法: 加同步锁;  synchronized(this) { 要访问的资源; } iOS 中的线程安全与线程同步 线程安全: 同一资源在统一时间只能允许一个线程进行访问 解决办法: 方法一: 加同步锁 @synchroniz

Python程序中的线程操作-锁

Python程序中的线程操作-锁 一.同步锁 1.1多个线程抢占资源的情况 from threading import Thread import os,time def work(): global n temp=n time.sleep(0.1) n=temp-1 if __name__ == '__main__': n=100 l=[] for i in range(100): p=Thread(target=work) l.append(p) p.start() for p in l:

Python程序中的线程操作-concurrent模块

Python程序中的线程操作-concurrent模块 一.Python标准模块--concurrent.futures 官方文档:https://docs.python.org/dev/library/concurrent.futures.html 二.介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor:进程池,提供异步调用 两者都实现相同的接口,该接口由抽象Execut

Python程序中的线程操作(线程池)-concurrent模块

目录 Python程序中的线程操作(线程池)-concurrent模块 一.Python标准模块--concurrent.futures 二.介绍 三.基本方法 四.ProcessPoolExecutor 五.ThreadPoolExecutor 六.map的用法 七.回调函数 Python程序中的线程操作(线程池)-concurrent模块 一.Python标准模块--concurrent.futures 官方文档:https://docs.python.org/dev/library/con

iOS 中SQLite数据库操作

在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 demo 具体过程: 1.创建名为 SQLite_Manage 的.h .m 文件,导入头文件 <sqlite3.h> 2.数据库在一个app中只有一个,使用单例模式:(代码如下) 1 + (SQLite_Manager *)sharedManager{ 2 static SQLite_Mana

iOS中保证线程安全的几种方式与性能对比

来源:景铭巴巴 链接:http://www.jianshu.com/p/938d68ed832c 一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized.NSLock.dispatch_semaphore.NSCondition.pthread_mutex.OSSpinLock.后来网上查了一下,发现他们的实现机制各不相同,性能也各不一样.不好意思,我们平常使用最多的@synchronized是性能最差的.下面我们先分别介绍每个加锁方式的使用,在使用

118 python程序中的线程操作-创建多线程

一.python线程的模块 1.1 thread和threading模块 thread模块提供了基本的线程和锁的支持 threading提供了更高级别.功能更强的线程管理的功能. 1.2 Queue模块 Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构. 1.3注意模块的选择 避免使用thread模块 因为更高级别的threading模块更为先进,对线程的支持更为完善 而且使用thread模块里的属性有可能会与threading出现冲突: 其次低级别的thread模块的同