iOS中多线程编程工具主要有:
- NSThread
- NSOperation
- GCD
这三种方法都简单易用,各有千秋.但无疑GCD是最有诱惑力的,因为其本身是apple为多核的并行运算提出的解决方案.虽然当前移动平台用双核的不多,但不影响GCD作为多线程编程的利器(ipad2已经是双核了,这无疑是一个趋势).
GCD是和block紧密相连的,所以最好先了解下block(可以查看这里).GCD是C level的函数,这意味着它也提供了C的函数指针作为参数,方便了C程序员.
下面首先来看GCD的使用:
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
async表明异步运行,block代表的是你要做的事情,queue则是你把任务交给谁来处理了.(除了async,还有sync,delay,本文以async为例).
之所以程序中会用到多线程是因为程序往往会需要读取数据,然后更新UI.为了良好的用户体验,读取数据的操作会倾向于在后台运行,这样以避免阻塞主线程.GCD里就有三种queue来处理.
1. Main queue:
顾名思义,运行在主线程,由dispatch_get_main_queue获得.和ui相关的就要使用Main Queue.
2.Serial quque(private dispatch queue)
每次运行一个任务,可以添加多个,执行次序FIFO. 通常是指程序员生成的,比如:
NSDate *da = [NSDate date]; NSString *daStr = [da description]; const char *queueName = [daStr UTF8String]; dispatch_queue_t myQueue = dispatch_queue_create(queueName, NULL);
3. Concurrent queue(global dispatch queue):
可以同时运行多个任务,每个任务的启动时间是按照加入queue的顺序,结束的顺序依赖各自的任务.使用dispatch_get_global_queue获得.
所以我们可以大致了解使用GCD的框架:
dispatch_async(getDataQueue,^{ //获取数据,获得一组后,刷新UI. dispatch_aysnc (mainQueue, ^{ //UI的更新需在主线程中进行 }; } )
由此可见,GCD的使用非常简单,以我的使用经验来看,以后会逐步淘汰使用NSOperation而改用GCD.
相关推荐
并发编程之Operation Queue和GCD Operation Queue是一个面向对象的并发编程接口,它支持并发数、线程优先级、任务优先级、任务依赖关系等多种配置,可以方便满足各种复杂的多任务处理场景。 GCD(Grand Central ...
压缩包中的`test_gcd_thread_asynchronous_concurrent`可能是一个测试项目,包含了一些用于演示`dispatch_async`和`DISPATCH_QUEUE_CONCURRENT`使用的代码文件。在这个项目中,开发者可能可以看到如何创建并行队列、...
dispatch_queue_t是GCD的核心,分为串行队列(serial queue)和并行队列(concurrent queue)。串行队列一次只执行一个任务,而并行队列则可以同时处理多个任务。在iOS中,有全局并行队列和主队列两种。全局并行队列...
苹果的Grand Central Dispatch (GCD) 提供了dispatch queue,用于调度block在不同的线程上执行。主要有两种类型的dispatch queue:串行队列(serial queue)和并行队列(concurrent queue)。 1. 串行队列:每个...
let queue = DispatchQueue.global(qos: .background) queue.async { // 在这里执行耗时操作,如下载数据 // ... // 完成后更新UI,但必须回到主线程 DispatchQueue.main.async { // 更新UI } } ``` 四、...
在iOS开发中,Grand Central Dispatch (GCD) 是一种强大的多线程管理工具,它能够帮助开发者高效地处理并发任务。本篇文章主要讨论了如何深入理解GCD中的dispatch_group、dispatch_barrier以及基于线程安全的多读单...
let queue1 = DispatchQueue(label: "thread1", qos: .background, attributes: .concurrent) let queue2 = DispatchQueue(label: "thread2", qos: .background, attributes: .concurrent) let timerSource = ...
Dispatch Queues是GCD的基本概念,dispatch queue是一个对象,它可以接受任务,并将任务以先到先执行的顺序来执行。dispatch queue可以是并发的或串行的。GCD中有三种队列类型: 1. 主队列(main queue):与主线程...
在iOS开发中,Grand Central Dispatch(GCD)是苹果公司提供的多线程解决方案,它极大地简化了并发编程。GCD是基于C语言的API,但同时也很好地与Objective-C和Swift兼容。这篇博客文章《ios gcd》可能深入探讨了如何...
DispatchQueue.global(qos: .userInteractive) // 最高优先级 DispatchQueue.global(qos: .userInitiated) // 默认优先级 DispatchQueue.global(qos: .utility) // 较低优先级 DispatchQueue.global(qos: ....
全局队列具有四种优先级:`DISPATCH_QUEUE_PRIORITY_HIGH`、`DISPATCH_QUEUE_PRIORITY_DEFAULT`、`DISPATCH_QUEUE_PRIORITY_LOW` 和 `DISPATCH_QUEUE_PRIORITY_BACKGROUND`。虽然自定义队列本身不支持直接设置优先级...
例如,可以使用`DispatchQueue.main.async`、`-[NSThread performSelectorOnMainThread:]`或`-[NSOperationQueue addOperationWithBlock:]`。 综上所述,GCD、NSThread和NSOperationQueue各有优缺点,选择哪种取决...
GCD的核心概念和特性包括Dispatch Queue、Dispatch Source、以及高效的内存管理机制。 ### GCD基本概念与特性 1. **GCD与NSOperationQueue的对比:** GCD和NSOperationQueue都可以将任务分解并排队,从而并发或...
在Swift中,GCD的API被封装在`DispatchQueue`类中,使用更加简洁。例如,创建并行队列并提交异步任务: ```swift let globalQueue = DispatchQueue.global(qos: .background) globalQueue.async { // 异步执行的...
private let queue: DispatchQueue init(queueType: QueueType) { if queueType == .serial { queue = DispatchQueue(label: "com.example.serialQueue", attributes: .serial) } else { queue = Dispatch...
dispatch_queue_t concurrentQueue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT); ``` 还可以使用dispatch_get_global_queue获取全局并行队列,一般传入DISPATCH_QUEUE_PRIORITY_DEFAULT作为...
1. dispatch_queue_t queue = dispatch_queue_create(“com.dispatch.serial”, DISPATCH_QUEUE_SERIAL); //生成一个串行队列,队列中的block按照先进先出(FIFO)的顺序去执行,实际上为单线程
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行任务 }); ``` 2. **创建本地串行队列**: ```swift dispatch_queue_t queue ...
- **Dispatch Queue**:调度队列是GCD的核心,用于管理任务的执行。主要有两种类型:串行队列(Serial Queue)和并行队列(Concurrent Queue)。串行队列一次仅执行一个任务,而并行队列则可以同时处理多个任务。 ...