background image

使用

NSOperation 和 NSOperationQueue 启动多线程的教

    App Store 中的很多应用程序非常的笨重,他们有好的界面,但操作性很差。比如说当程
序从网上或本地载入数据的时候,界面被冻结了,用户只能等程序完全载入数据之后才能
进行操作。
    当打开一个应用程序时,iPhone 会产生一个包含 main 方法的线程,所用程序中的界面都
是运行在这个线程之中的(

table views, tab bars, alerts…),有时候我们会用数据填充这些

view,现在问题是如何有效的载入数据,并且用户还能自如的操作程序。方法是启动新的线

 

程,专门用于数据的下载,而主线程不会因为下载数据被阻塞。
    不管使用任何编程语言,在实现多线程时都是一件很麻烦的事情。更糟糕的是,一旦出错,
 这种错误通常相当糟糕。然而,幸运的是 Apple 从 Mac OS X 10.5 开始在这方面做了很多的
改进,

NSThread 的引入,使得开发多线程应用程序容易多了。除此之外,它们还引入了两

个全新的类:

NSOperation 和 NSOperationQueue。

    接下来我们通过一个实例来剖析如何使用这两个类实现多线程。这里指示展示这两个类的
基本用法,当然这不是使用他们的唯一办法。如果你熟悉

java 或者它的别的变种语言的话 ,

你会发现

NSOperation 对象很像 java.lang.Runnable 接口,就像 java.lang.Runnable 接口那 样,

NSOperation 类也被设计为可扩展的,而且只有一个需要重写的方法。它就是-(void)main。
使用

NSOperation 的最简单的方 式就是把一个 NSOperation 对象加入到 NSOperationQueue

队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对

 象的所有操

作完成。然后它被队列释放。
    下面的例子中,使用一个获取网页,并对其解析程 NSXMLDocument,最后将解析得到

NSXMLDocument 返 回 给 主 线 程 。 PageLoadOperation.h@interface  PageLoadOperation  : 

NSOperation {
    NSURL *targetURL;}
@property(retain) NSURL *targetURL;
- (id)initWithURL:(NSURL*)url;@end

PageLoadOperation.m
#import 

"PageLoadOperation.h"#import 

"AppDelegate.h"@implementation 

PageLoadOperation@synthesize targetURL;- (id)initWithURL:(NSURL*)url;{
    if (![super init]) return nil;
    [self setTargetURL:url];
    return self;}- (void)dealloc {
    [targetURL release], targetURL = nil;
    [super dealloc];
}
- (void)main