如何使用ios nsoperation 使用s和ios nsoperation 使用Queues

NSOperationQueue和NSOperation的使用方法(转)
多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说。
为了能让初级开发工程师也能使用多线程,同时还要简化复杂性。各种编程工具提供了各自的办法。对于iOS来说,建议在尽可能的情况下避免直接操作线程,使用比如NSOperationQueue这样的机制。
可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。
你可以设置线程池中只有一个线程,这样,各个操作就可以认为是近似的顺序执行了。为什么说是近似呢,后面会做解释。
编写最简单的示例
先写个最简单的示例。
编写一个NSOperation的子类,只需实现main方法。这里非常类似Java的Thread,你可以继承它,并覆盖run方法,在该方法里面写入需要执行的代码。这里的main方法和run方法作用是相似的。
@interface MyTask : NSOperation {
int operationId;
@property int operationId;
这里的operationId属性不是必须的,是我想在后面标识区分多个Task的标识位。
@implementation MyTask
@synthesize operationId;
- (void)main{
NSLog(@"task %i run … ",operationId);
[NSThread sleepForTimeInterval:10];
NSLog(@"task %i is finished. ",operationId);
这里模拟了一个耗时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秒钟后,日志打印完毕,类似这样:
1 2011-07-18 15:59:14.622 MultiThreadTest[24271:6103] task 1 run …
2 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];
那么打印出的内容是不定的,有可能是这样:
1 2011-07-18 15:49:48.087 MultiThreadTest[24139:6203] task 1 run …
2 2011-07-18 15:49:48.087 MultiThreadTest[24139:1903] task 2 run …
3 2011-07-18 15:49:58.122 MultiThreadTest[24139:6203] task 1 is finished.
4 2011-07-18 15:49:58.122 MultiThreadTest[24139:1903] task 2 is finished.
甚至有可能是这样:
1 2011-07-18 15:52:24.686 MultiThreadTest[24168:1b03] task 2 run …
2 2011-07-18 15:52:24.685 MultiThreadTest[24168:6003] task 1 run …
3 2011-07-18 15:52:34.708 MultiThreadTest[24168:1b03] task 2 is finished.
4 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];
这样,即使是多线程情况下,可以看到操作是严格按照先后次序执行的。
控制线程池中的线程数
可以通过类似下面的代码:
1 [queue setMaxConcurrentOperationCount:2];
来设置线程池中的线程数,也就是并发操作数。默认情况下是-1,也就是没有限制,同时运行队列中的全部操作。
转自:/thread-.html
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。如何使用NSOperations和NSOperationQueues_百度知道
如何使用NSOperations和NSOperationQueues
提问者采纳
声明一个NSDictionary的实例对象,我们就宏定义kDatasourceURLString这个是数据源的地址字符串。4。现在切换到ListViewController,也就是import头文件,这个也就是数据源:1,也就是替换NSObject为UITableViewController、然后让ListViewController成为UITableViewController的子类;&#47,也做下面的改变。2、引入UIKitandCoreImage现在让我们来看看上面代码的意思吧、为了方便点.m:@implementation ListViewController/ 1@synthesize photos = _photos。3
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁如何使用 NSOperations 和 NSOperationQueues_百度知道
如何使用 NSOperations 和 NSOperationQueues
提问者采纳
从技术点上来看,由操作系统提供的,每个人都可以干自己的事,用户交互就会有反应: 在一个应用程序里,是非常容易犯错的,不过建议去看看。在开始这篇教程的时候,直到你能够操作才消失:就是你的app需要一些消耗大量cpu计算时间的任务的时候。作为一个程序员。你应该听说过并发处理和并行处理,于是每个人都会轮流来使用这把刀来削水果,但是在管理多线程上面NSThread还是比较头疼。有一个基本的framework包含了一个叫NSThread的类,所以你也可以不用去读刚刚的那个教程,知道一些专业术语是很重要的。首先: 一块可执行的二进制代码每个人应该都有使用某款ios或者mac的app的时候出现未响应的现象吧。 如果是ios的app,而不用去等待别人。所以并行效率会很高,并且也是操作系统的一部分。背景在开始这篇教程的时候。在这篇教程里面,线程功能是由POSIX线程API(或者pthreads)提供的。解释这个现象倒是很简单,这样就会给用户很差的用户体验:有三把水果刀了,包含了很多可执行指令的集合。进程,要是比较幸运的话,也就是说使用多线程来执行你的任务: 在iphone和mac上面,很好的,你永远不能保证你的代码将会运行在一台能够使用并行处理的的机器上,而且这个错误是很难被找到的,会给你提供良好的人机交互感受,这个类非常容易使用。线程,在主线程里面就基本上没时间来处理你的UI交互了,那还会出现无敌风火轮,有些时候还可能就这样卡闪退了。注意。这个是相当底层的接口,不会出现卡的情况。(这里简单用一个比喻来说明一下并发和并行。为了看到他的效果,并行是硬件的性质,交互性如此的不好。一般的一个解决办法就是通过并发处理来让当前复杂的计算离开当前的主线程,会对你有很大的帮助的。NSOperation 和NSOperationQueue是一个高度封装的类,但是受硬件限制,你将会学习如何使用他们。并发就是,就只能等了。并行就是。这样的话:作业,每个人一个水果,所以看起来就卡了,并发其实就是多线程),这个时候会加上并发处理,有一些技术概念需要普及一下。但是你可以设计你的代码以至于你可以使用并发处理: 一些需要被处理的简单的工作,并发是程序的性质,首先我们会创建一个一点也不使用多线程的app。不过这篇教程是比较简单的:假如有三个人。还有一种在ios中并发处理的方法就是使用NSOperation和NSOperationQueue,但是在他们面前只有一把水果刀,所以你将会看到这个app运行时是如此的不流畅。如果是mac下面的app,简化了操作多线程的难度,要是你去读一下ios官方的多线程和GCD教程。所以并行和并发其实是两个不同的概念,所以使用的话,由许多线程组成。然后我们会重写这个app
其他类似问题
为您推荐:
刺客联盟的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁如何使用NSOperations和NSOperationQueues_百度知道
如何使用NSOperations和NSOperationQueues
我有更好的答案
在开始这篇教程的时候,有一些技术概念需要普及一下。你应该听说过并发处理和并行处理。从技术点上来看,并发是程序的性质,并行是硬件的性质。所以并行和并发其实是两个不同的概念。作为一个程序员,你永远不能保证你的代码将会运行在一台能够使用并行处理的的机器上。但是你可以设计你的代码以至于你可以使用并发处理。(这里简单用一个比喻来说明一下并发和并行。并发就是:假如有三个人,每个人一个水果,但是在他们面前只有一把水果刀,于是每个人都会轮流来使用这把刀来削水果。并行就是:有三把水果刀了,每个人都可以干自己的事,而不用去等待别人。所以并行效率会很高,但是受硬件限制,并发其实就是多线程)。 首先,知道一些专业术语是很重要的: 作业: 一些需要被处理的简单的工作。 线程: 在一个...
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 ios nsoperation 使用 的文章

 

随机推荐