首先,简单区分这几个类关键词:
NSOperation:可以理解程一个“操作”,一个要做的事件,感觉类似如java中的runnable,NSOperation只有添加到线程队列中才能被执行。
NSOperationQueue:可以勉强的叫做线程队列吧,他是专门管理添加到他里面NSOperation,然后根据情况,开启线程执行对应的“操作”,java作用,也有对应的类,或者我们自己写一个队列。
NSOperationQueue的目的就是多线程管理,一个NSOperationQueue 操作队列,就相当于一个线程管理器,而非一个线程。因为你可以设置这个线程管理器内可以并行运行的的线程数量等等。
下面是建立并初始化一个操作队列,而且我们可以设置这个队列每次被处理的“操作(NSOperation)”数量:
1 | NSOperationQueue *aQ = [[NSOperationQueue alloc] init]; |
2 | [aQ setMaxConcurrentOperationCount:10]; |
然后,我们后面就可以建立需要操作的任务啦,然后加到操作队列中,就可以实现队多线程啦,ios中,使用NSInvocationOperation(NSOperation的子类)是最简单的多线程编程方式,在iPhone编程中是经常被用到的
1 | /创建一个NSInvocationOperation对象,并初始化到方法 |
2 | //在这里,selector参数后的值是你想在另外一个线程中运行的方法(函数,Method) |
3 | //在这里,object后的值是想传递给前面方法的数据 |
4 | NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self |
5 | selector:@selector(myTaskMethod:) object:data]; |
7 | // 下面将我们建立的操作“Operation”加入到本地程序的共享队列中(加入后方法就会立刻被执行) |
9 | [aQ addOperation:theOp]; |
2 | - (void)myTaskMethod:(id)data |
简单介绍之后,其实可以发现这种方法是非常简单的。很多的时候我们使用多线程仅仅是为了防止主线程堵塞,而NSInvocationOperation就是最简单的多线程编程,故该中方式在iPhone编程中是经常被用到的。
复杂点的做法是,自己写一个NSOperation的子类,类似于java中的,实现runnable接口,里面可以加更多复杂的逻辑,然后将他加到NSOperationQueue中,就ok啦