黑马程序员--日记一--IOS多线程学习

来源:互联网 发布:淘宝客淘口令前面描述 编辑:程序博客网 时间:2024/04/25 23:54

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

在Object-c中,常用的多线程处理类分别为NSThread和NSOperationQueue。使用这两个类处理多线程,让复杂的多线程处理变得简单高效。
一、NSThread类

苹果公司的Cocoa框架共支持三种多线程机制,分别为NSThread、GCD(Grand Central Dispatch)(iOS4 才开始支持)、Cocoa NSOperatio。NSThree是官方推荐的线程处理方式,它在处理机制上,需要开发者负责手动管理Thread的生命周期,包括子线程与主线程之间的同步等。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程 对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread。初次接触的读者也许会觉得生涩,但事实上NSThread类已经提供了完善的接口,在使用方式上并不会太难。使用NSTread管理线程,主要的步骤如下。

1)声明一个NSCondition同步锁;

2)声明若干个NSThread子线程;

3)指定NSThread子线程的目标指行方法(可以在构造函数中指定);

4)设置子线程的名称;

5)star启动子线程。

其中,子线程的执行方法一般只需要一个共同方法即可(可以通过线程名,分辨当前的执行线程)。下面通过代码演示NSThread类的使用。假设我们需要下载网络图片,在非异步形式的情况下,IOS界面必须等到图片下载完毕后,UI才会反应。这时利用多线程就可以达到异步下载的效果。

[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];NSThread* myThread = [[NSThread alloc] initWithTarget:self                                                 selector:@selector(myThreadMainMethod:)                                                   object:nil];[myThread start]; //启动线程

这两种方式的区别是:前一种一调用就会立即创建一个线程来做事情;而后一种虽然你 alloc 了也 init了,但是要直到我们手动调用 start 启动线程时才会真正去创建线程。这种延迟实现思想在很多跟资源相关的地方都有用到。后一种方式我们还可以在启动线程之前,对线程进行配置,比如设置 stack 大小,线程优先级。
此外还有一种间接的方式:利用NSObject的方法
performSelectorInBackground:withObject: 来创建一个线程:

[myObj performSelectorInBackground:@selector(myThreadMainMethod) withObject:nil]; //在后台运行某一个方法

其效果与 NSThread 的 detachNewThreadSelector:toTarget:withObject: 是一样的。

二、NSOperationQueue类

如果需要让线程同时并行运行多个,可以将线程加入队列(Queue)中,NSOperationQueue类就是一个线程队列管理类,他提供了线程并行、队列的管理。可以认为NSOperationQueue就是一个线程管理器,通过addOperations方法,我们可以一次性把多个(数组形式)线程添加到队列中。同时,NSOperationQueue允许通过setMaxConcurrentOperationCount方法设置队列的并行(同一时间)运行数量。NSOperationQueue的使用步骤如下。

1)声明一个NSOperationQueue对象;

2)声明若干个NSInvocationOperation子线程对象,并指定回调方法;

3)将NSInvocationOperation子线程添加到数组;

4)把数组赋给NSOperationQueue类中的addOperations方法;

5) 实现回调方法;

6)在回调方法中实现performSelectorOnMainThread方法,更新主线程上的界面UI元素。

并发执行你需要重载如下4个方法
//执行任务主函数,线程运行的入口函数
-(void)start
//是否允许并发,返回YES,允许并发,返回NO不允许。默认返回NO
-(BOOL)isConcurrent
- (BOOL)isExecuting
//是否已经完成,这个必须要重载,不然放在放在NSOperationQueue里的NSOpertaion不能正常释放。
- (BOOL)isFinished

比如TestNSOperation:NSOperaion 重载上述的4个方法,
声明一个NSOperationQueue

NSOperationQueue *queue = [[[NSOperationQueue alloc ] init]autorelease];[queue addOperation:testNSoperation];

它会自动调用TestNSOperation里的start函数,如果需要多个NSOperation,你需要设置queue的一些属性,如果多个NSOperation之间有依赖关系,也可以设置,具体可以参考API文档。

(2)非并发执行

-(void)main
只需要重载这个main方法就可以了。

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

0 0
原创粉丝点击