多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说。
为了能让初级开发工程师也能使用多线程,同时还要简化复杂性。各种编程工具提供了各自的办法。对于iOS来说,建议在尽可能的情况下避免直接操作线程,使用比如NSOperationQueue这样的机制。
可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。
你可以设置线程池中只有一个线程,这样,各个操作就可以认为是近似的顺序执行了。为什么说是近似呢,后面会做解释。
编写最简单的示例
先写个最简单的示例。
编写一个NSOperation的子类,只需实现main方法。这里非常类似Java的Thread,你可以继承它,并覆盖run方法,在该方法里面写入需要执行的代码。这里的main方法和run方法作用是相似的。
头文件:
@interface MyTask : NSOperation {
int operationId;
}
@property int operationId;
@end
这里的operationId属性不是必须的,是我想在后面标识区分多个Task的标识位。
m文件:
@implementation MyTask
@synthesize operationId;
- (void)main{
NSLog(@"task %i run … ",operationId);
[NSThread sleepForTimeInterval:10];
NSLog(@"task %i is finished. ",operationId);
}
@end
这里模拟了一个耗时10秒钟的操作。
下面需要把Task加入到队列中:
- (void)viewDidLoad {
[super viewDidLoad];
queue=[[NSOperationQueue alloc] init];
int index=1;
MyTask *task=[[[MyTask alloc] init] autorelease];
task.operationId=index++;
[queue addOperation:task];
我直接找了个Controller的方法写上了。运行结果是,界面出现了,而task还未执行完,说明是多线程的。10秒钟后,日志打印完毕,类似这样:
2011-07-18 15:59:14.622 MultiThreadTest[24271:6103] task 1 run …
2011-07-18 15:59:24.623 MultiThreadTest[24271:6103] task 1 is finished.
可以向操作队列(NSOperationQueue)增加多个操作,比如这样:
- (void)viewDidLoad {
[super viewDidLoad];
queue=[[NSOperationQueue alloc] init];
int index=1;
MyTask *task=[[[MyTask alloc] init] autorelease];
task.operationId=index++;
[queue addOperation:task];
task=[[[MyTask alloc] init] autorelease];
task.operationId=index++;
[queue addOperation:task];
}
那么打印出的内容是不定的,有可能是这样:
2011-07-18 15:49:48.087 MultiThreadTest[24139:6203] task 1 run …
2011-07-18 15:49:48.087 MultiThreadTest[24139:1903] task 2 run …
2011-07-18 15:49:58.122 MultiThreadTest[24139:6203] task 1 is finished.
2011-07-18 15:49:58.122 MultiThreadTest[24139:1903] task 2 is finished.
甚至有可能是这样:
2011-07-18 15:52:24.686 MultiThreadTest[24168:1b03] task 2 run …
2011-07-18 15:52:24.685 MultiThreadTest[24168:6003] task 1 run …
2011-07-18 15:52:34.708 MultiThreadTest[24168:1b03] task 2 is finished.
2011-07-18 15:52:34.708 MultiThreadTest[24168:6003] task 1 is finished.
因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。
那么,如果需要严格意义的顺序执行,怎么办呢?
处理操作之间的依赖关系
如果操作直接有依赖关系,比如第二个操作必须等第一个操作结束后再执行,需要这样写:
queue=[[NSOperationQueue alloc] init];
int index=1;
MyTask *task=[[[MyTask alloc] init] autorelease];
task.operationId=index++;
[queue addOperation:task];
task=[[[MyTask alloc] init] autorelease];
task.operationId=index++;
if ([[queue operations] count]>0) {
MyTask *theBeforeTask=[[queue operations] lastObject];
[task addDependency:theBeforeTask];
}
[queue addOperation:task];
这样,即使是多线程情况下,可以看到操作是严格按照先后次序执行的。
控制线程池中的线程数
可以通过类似下面的代码:
[queue setMaxConcurrentOperationCount:2];
来设置线程池中的线程数,也就是并发操作数。默认情况下是-1,也就是没有限制,同时运行队列中的全部操作。
转自:http://www.codeios.com/thread-1688-1-1.html
分享到:
相关推荐
本文将深入探讨四种常用的iOS多线程开发方式:pthread、NSThread、NSOperation及NSOperationQueue,以及Grand Central Dispatch(GCD)。 首先,让我们了解下pthread。pthread是POSIX线程库,它在iOS中被用于跨平台...
在iOS开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用程序的高效运行,提升用户体验。本文将深入探讨iOS中的多线程技术,包括NSOperation和GCD(Grand Central Dispatch)两种主要的实现方式,以及...
iOS开发中的多线程技术是提升应用性能和用户体验的关键,特别是在处理耗时操作时,如网络请求、数据计算或大文件上传。本文将对多线程进行深入总结,主要涵盖线程的基本概念、使用多线程的原因以及在iPhone平台上...
在iOS应用开发中,多线程技术是至关重要的,它能帮助我们实现高效的资源管理和流畅的用户体验。本文将深入探讨“iPhone开发多线程”这一主题,基于提供的描述和标签,我们将关注iOS平台上的多线程概念、实现方式以及...
在IT行业中,多线程编程是一项至关重要的技术,特别是在iOS开发中。多线程使得应用程序能够同时执行多个任务,提高系统资源的利用率,提升用户体验。本文将深入探讨多线程编程的基本概念、实现方式以及在iOS开发中的...
GCD是苹果推出的一种高性能的多线程解决方案,它使用了C语言的函数库,通过强大的队列管理简化了多线程编程的复杂性。 执行任务时,我们可以使用同步执行(sync)和异步执行(async)两种方式。同步执行会阻塞线程...
### iOS开发多线程编程指南 #### 简介与文档结构 本指南旨在帮助iOS开发者深入了解多线程编程的概念、原理以及最佳实践。多线程编程是提高应用程序响应性和性能的关键技术之一,在iOS开发中尤其重要。通过合理地...
NSOperation和NSOperationQueue是Apple在iOS和macOS开发中提供的多线程处理框架,用于高效管理和调度异步任务。这两个类是Foundation框架的一部分,旨在简化并发编程,提高应用程序的性能和响应性。 **NSOperation*...
1. GCD(Grand Central Dispatch):苹果提供的多线程解决方案,它简化了并发任务的管理。我们可以使用`dispatch_queue_create`创建一个队列,然后用`dispatch_async`异步提交任务到队列,这样就能在后台线程执行推...
在iOS应用开发中,多线程是一个至关重要的概念,它使得应用程序可以同时执行多个任务,提升用户体验并优化系统资源的使用。本资源“IOS应用源码——多线程.zip”包含了一个具体的iOS应用实例,用于展示如何在项目中...
在iOS开发中,多线程编程是至关重要的技术,它使得应用程序可以同时执行多个任务,提升用户体验并优化系统资源的使用。"iPhone多线程编程"这个主题涵盖了许多关键概念和实践技巧,对于任何想要深入学习iOS开发的初学...
《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Apple平台开发中的关键技术的书籍。本书主要围绕Objective-C语言在iOS和OS X操作系统上的应用,特别是针对多线程和内存管理这两个核心主题进行...
GCD可以简化多线程编程,开发者可以不必直接与低级线程API打交道,而是通过GCD提供的队列和任务的方式来实现多任务的并发执行。GCD在内部管理线程池,可以根据任务负载自动地创建和销毁线程,大大提高了资源利用效率...
在iOS应用开发中,多线程技术是必不可少的,它能帮助我们实现应用程序的高效运行,提高用户体验。Swift作为Apple的官方编程语言,提供了多种方式来处理多线程。本Demo "swift-iOS多线程详细Demo" 旨在深入探讨Swift...
在iOS开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用的高效运行,提升用户体验。本文将深入探讨四种主要的iOS多线程机制:Pthreads、NSThread、GCD(Grand Central Dispatch)以及NSOperation和...
在IT行业中,多线程开发是一项至关重要的技术,特别是在iOS和macOS开发中。多线程使得应用程序可以同时执行多个任务,从而提高了系统的效率和用户体验。GCD(Grand Central Dispatch)是苹果公司引入的一种用于多核...
首先,GCD是Apple推出的一种多线程解决方案,它简化了线程管理和任务调度。GCD基于C语言,但在Objective-C和Swift中都可以方便地使用。GCD的核心概念包括队列(Dispatch Queue)和任务(Dispatch Work Item)。队列...
### iOS多线程指南知识点详解 ...在iOS开发中,合理使用多线程技术和工具对于构建高性能的应用至关重要。除了本文档之外,还可以参考Apple官方文档、开源社区资源和技术博客等,不断深入学习和实践。
- **简介**:GCD是苹果推出的一个高性能并发编程框架,旨在简化多线程编程。它提供了丰富的API来创建线程和执行异步任务,并且支持块(Block)语法。 - **示例**:例如,可以在全局队列中异步下载一张大图片,...