使用 NSOperation的方式有两种,
一种是用定义好的两个子类:
NSInvocationOperation 和 NSBlockOperation。
另一种是继承NSOperation
如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似。和Java的Runnable一样,NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main。相当与java 中Runnalbe的Run方法。然后把NSOperation子类的对象放入NSOperationQueue队列中,该队列就会启动并开始处理它。
NSInvocationOperation例子:
和前面一篇博文一样,我们实现一个下载图片的例子。新建一个Single View app,拖放一个ImageView控件到xib界面。
实现代码如下:
#import "ViewController.h"
#define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self
selector:@selector(downloadImage:)
object:kURL];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation];
// Do any additional setup after loading the view, typically from a nib.
}
-(void)downloadImage:(NSString *)url{
NSLog(@"url:%@", url);
NSURL *nsUrl = [NSURL URLWithString:url];
NSData *data = [[NSData alloc]initWithContentsOfURL:nsUrl];
UIImage * image = [[UIImage alloc]initWithData:data];
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
-(void)updateUI:(UIImage*) image{
self.imageView.image = image;
}
1.viewDidLoad方法里可以看到我们用NSInvocationOperation建了一个后台线程,并且放到NSOperationQueue中。后台线程执行downloadImage方法。
2.downloadImage 方法处理下载图片的逻辑。下载完成后用performSelectorOnMainThread执行主线程updateUI方法。
3.updateUI 并把下载的图片显示到图片控件中。
运行可以看到下载图片显示在界面上。
[img]
[/img]
第二种方式继承NSOperation
在.m文件中实现main方法,main方法编写要执行的代码即可。
如何控制线程池中的线程数?
队列里可以加入很多个NSOperation, 可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。
通过下面的代码设置:
[queue setMaxConcurrentOperationCount:5];
线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。
- 大小: 151.4 KB
分享到:
相关推荐
iOS中有以下3种多线程编程方法: NSThread Grand Centeral Dispatch(GCD) NSOperation和NSOperationQueue 1.NSThread 这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法。但是因为需要自己管理线程的...
配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQueue中 ...
总结来说,iOS多线程开发包括pthread、NSThread、NSOperation&NSOperationQueue以及GCD四种常见方式,每种都有其特点和适用场景。理解并掌握这些技术,能够帮助开发者编写出更加流畅、高效的iOS应用。
NSOperation和NSOperationQueue是Apple在iOS和macOS开发中提供的多线程处理框架,用于高效管理和调度异步任务。这两个类是Foundation框架的一部分,旨在简化并发编程,提高应用程序的性能和响应性。 **NSOperation*...
总之,NSOperation和NSOperationQueue为iOS开发者提供了一种高效、易用的方式来实现多线程编程,它们提供了取消、依赖关系、自定义行为等功能,使得处理复杂任务变得更加简单。在实际开发中,可以根据需求选择合适的...
1.、NSThread2、CocoaNSOperation(IOS多线程编程之NSOperation和NSOperationQueue的使用)3、GCD全称:GrandCentralDispatch(IOS多线程编程之Grand CentralDispatch(GCD)介绍和使用)这三种编程方式从上到下,抽象...
本篇文章将深入探讨iOS多线程中的NSOperation及其相关知识点。 一、NSOperation简介 NSOperation是Objective-C中的一个抽象类,它是操作对象的基类。与直接使用GCD相比,NSOperation提供了更丰富的特性,如依赖管理...
总结来说,NSOperation类在iOS多线程应用开发中扮演了重要角色。通过使用NSOperation和NSOperationQueue,开发者可以更方便地管理并发任务,实现异步执行,同时还能享受到其他高级功能,如依赖关系、取消操作等。...
总的来说,iOS开发中的多线程技术涉及NSThread、POSIX Thread、NSOperation与NSOperationQueue以及GCD等,它们各有优势和使用场景。而RunLoop是管理线程生命周期的关键组件,对于理解iOS应用性能优化至关重要。掌握...
本文将深入探讨iOS多线程编程的主要知识点。 首先,我们要了解iOS中的多线程模型。主要有三种实现方式:NSOperationQueue、NSThread和GCD(Grand Central Dispatch)。GCD是苹果推出的一种高效、简洁的多线程管理...
2、Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用)3、GCD 全称:Grand Central Dispatch( iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用) 这三种编程方式从上到下,抽象度...
#iOS的三种多线程技术 和特性 1.NSThread 2.NSOperation/NSOperationQueue 3.GCD (大中心调度)
### iOS多线程编程技术详解:NSThread、Cocoa NSOperation、GCD #### 一、多线程基本概念 1. **进程**:在移动设备(如iPhone)上,每一个应用程序都可以被视为一个独立的进程。每个进程都会有一个主线程(main ...
本资源“IOS应用源码之多线程编程.zip”显然是一个专门探讨iOS多线程编程的代码集合,包含了示例源码和可能的相关教程。 一、多线程简介 在iOS开发中,多线程主要用于实现应用的并发执行,让程序的不同部分可以在...
### iOS多线程编程指南 #### 一、引言与多线程概念 随着计算机硬件技术的发展,现代设备越来越依赖于多核处理器来提高性能。为了充分利用这些硬件资源,iOS应用开发者需要掌握多线程编程技术。多线程能够使应用在...
本文将作为iOS多线程编程指南的第一部分,深入探讨多线程的基本概念、常用技术以及最佳实践。 1. **多线程基础** 多线程是指在一个应用程序中同时执行多个独立的执行流,每个执行流被称为一个线程。在iOS中,多...
在iOS开发中,多线程和并发编程是关键的技术领域,它们允许应用程序同时处理多个任务,提高用户体验并优化系统资源的使用。以下是对标题“iOS并发编程指南与多线程编程指南合集”以及描述中提及知识点的详细解读: ...
本文将深入探讨四种主要的iOS多线程机制:Pthreads、NSThread、GCD(Grand Central Dispatch)以及NSOperation和NSOperationQueue。 首先,Pthreads是POSIX线程库的一部分,支持跨平台的多线程编程。在iOS中,虽然...