`
lizaochengwen
  • 浏览: 659874 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用NSOperationQueue简化多线程开发(转)

阅读更多
多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说。

为了能让初级开发工程师也能使用多线程,同时还要简化复杂性。各种编程工具提供了各自的办法。对于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多线程开发的常用四种方式和基本使用

    本文将深入探讨四种常用的iOS多线程开发方式:pthread、NSThread、NSOperation及NSOperationQueue,以及Grand Central Dispatch(GCD)。 首先,让我们了解下pthread。pthread是POSIX线程库,它在iOS中被用于跨平台...

    ios 开发多线程

    在iOS开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用程序的高效运行,提升用户体验。本文将深入探讨iOS中的多线程技术,包括NSOperation和GCD(Grand Central Dispatch)两种主要的实现方式,以及...

    iOS 开发 之 多线程总结

    iOS开发中的多线程技术是提升应用性能和用户体验的关键,特别是在处理耗时操作时,如网络请求、数据计算或大文件上传。本文将对多线程进行深入总结,主要涵盖线程的基本概念、使用多线程的原因以及在iPhone平台上...

    iphone开发多线程

    在iOS应用开发中,多线程技术是至关重要的,它能帮助我们实现高效的资源管理和流畅的用户体验。本文将深入探讨“iPhone开发多线程”这一主题,基于提供的描述和标签,我们将关注iOS平台上的多线程概念、实现方式以及...

    多线程编程指南

    在IT行业中,多线程编程是一项至关重要的技术,特别是在iOS开发中。多线程使得应用程序能够同时执行多个任务,提高系统资源的利用率,提升用户体验。本文将深入探讨多线程编程的基本概念、实现方式以及在iOS开发中的...

    哈哈iOS多线程面试题

    GCD是苹果推出的一种高性能的多线程解决方案,它使用了C语言的函数库,通过强大的队列管理简化了多线程编程的复杂性。 执行任务时,我们可以使用同步执行(sync)和异步执行(async)两种方式。同步执行会阻塞线程...

    iOS开发多线程编程指南

    ### iOS开发多线程编程指南 #### 简介与文档结构 本指南旨在帮助iOS开发者深入了解多线程编程的概念、原理以及最佳实践。多线程编程是提高应用程序响应性和性能的关键技术之一,在iOS开发中尤其重要。通过合理地...

    NSOperation_NSOperationQueue_Demo

    NSOperation和NSOperationQueue是Apple在iOS和macOS开发中提供的多线程处理框架,用于高效管理和调度异步任务。这两个类是Foundation框架的一部分,旨在简化并发编程,提高应用程序的性能和响应性。 **NSOperation*...

    苹果推送多线程

    1. GCD(Grand Central Dispatch):苹果提供的多线程解决方案,它简化了并发任务的管理。我们可以使用`dispatch_queue_create`创建一个队列,然后用`dispatch_async`异步提交任务到队列,这样就能在后台线程执行推...

    IOS应用源码——多线程.zip

    在iOS应用开发中,多线程是一个至关重要的概念,它使得应用程序可以同时执行多个任务,提升用户体验并优化系统资源的使用。本资源“IOS应用源码——多线程.zip”包含了一个具体的iOS应用实例,用于展示如何在项目中...

    iphone多线程编程

    在iOS开发中,多线程编程是至关重要的技术,它使得应用程序可以同时执行多个任务,提升用户体验并优化系统资源的使用。"iPhone多线程编程"这个主题涵盖了许多关键概念和实践技巧,对于任何想要深入学习iOS开发的初学...

    Objective-C高级编程 iOS与OS X多线程和内存管理_Objective-C_ios_

    《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Apple平台开发中的关键技术的书籍。本书主要围绕Objective-C语言在iOS和OS X操作系统上的应用,特别是针对多线程和内存管理这两个核心主题进行...

    Multithreading(苹果操作系统cocoa多线程编程)

    GCD可以简化多线程编程,开发者可以不必直接与低级线程API打交道,而是通过GCD提供的队列和任务的方式来实现多任务的并发执行。GCD在内部管理线程池,可以根据任务负载自动地创建和销毁线程,大大提高了资源利用效率...

    swift-iOS多线程详细Demo

    在iOS应用开发中,多线程技术是必不可少的,它能帮助我们实现应用程序的高效运行,提高用户体验。Swift作为Apple的官方编程语言,提供了多种方式来处理多线程。本Demo "swift-iOS多线程详细Demo" 旨在深入探讨Swift...

    iOS 多线程总结

    在iOS开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用的高效运行,提升用户体验。本文将深入探讨四种主要的iOS多线程机制:Pthreads、NSThread、GCD(Grand Central Dispatch)以及NSOperation和...

    多线程开发

    在IT行业中,多线程开发是一项至关重要的技术,特别是在iOS和macOS开发中。多线程使得应用程序可以同时执行多个任务,从而提高了系统的效率和用户体验。GCD(Grand Central Dispatch)是苹果公司引入的一种用于多核...

    iOS多线程编程

    首先,GCD是Apple推出的一种多线程解决方案,它简化了线程管理和任务调度。GCD基于C语言,但在Objective-C和Swift中都可以方便地使用。GCD的核心概念包括队列(Dispatch Queue)和任务(Dispatch Work Item)。队列...

    ios多线程指南

    ### iOS多线程指南知识点详解 ...在iOS开发中,合理使用多线程技术和工具对于构建高性能的应用至关重要。除了本文档之外,还可以参考Apple官方文档、开源社区资源和技术博客等,不断深入学习和实践。

    iOS中多线程原理与runloop介绍

    - **简介**:GCD是苹果推出的一个高性能并发编程框架,旨在简化多线程编程。它提供了丰富的API来创建线程和执行异步任务,并且支持块(Block)语法。 - **示例**:例如,可以在全局队列中异步下载一张大图片,...

Global site tag (gtag.js) - Google Analytics