iOS多线程开发(六)---NSOperation/NSOperationQueue

    Apple从os x10.5在多线程应用的开发上有了很多改进,NSThread的引入使得开发多线程应用程序变得容易多了,尤其是引入了两个全新的类:NSOperation和NSOperationQueue。NSOperation对象类似java.lang.Runnable接口,也被设计为可扩展的,而且只有一个需要重写的方法。这就是-(void)main。

   NSOperation是一个抽象类,必须重载NSOperation派生新的子类。使用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];

      [super dealloc];

}


- (void)main

{

    NSString  *webpageString = [[[NSString  alloc] initWithContentsOfURL:[self targetURL]] autorelease];

    NSError *error = nil;

    NSXMLDocument  *document = [[NSXMLDocument alloc] initWithXMLString:webpageString  options:NSXMLDocuemtTidyHTML  error:&error];

    if (!document){

           NSLog(@"%s Error loading document(%@):%@",_cmd,[[self  targetURL]  absoluteString], error];

    return;

    }

    [[AppDelegate  shared] performSelectorOnMainThread:@selector(pageLoaded:)  withObject:document  waitUntilDon:YES];

     [document  release];

}

@end

   正是这样,该类很简单,只是在其init方法中接受一个url并保存起来,当main函数被调用的时候,它使用这个保存的url创建一个字符串,并将其传递给NSXMLDocumentinit方法。如果加载的xml数据没有出错,数据会被传递给AppDelegate,它处于主线程中。到此,这个线程的任务就宣告完成了。在主线程中注销操作队列时,会将这个NSOperation对象释放。


// AppDelegate.h

@interface AppDelegate : NSObject {

     NSOperationQueue  *queue;

}


+ (id)shared;

- (void)pageLoaded:(NSXMLDocument *)document;

@end


//AppDelegate.m

#import "AppDelegate.h"

#import "PageLoadOperation.h"

@implementation AppDelegate

static AppDelegate  *shared;

static NSArray  *urlArray;

- (id)init

{

    if(shared)

    {

        [self  autorelease];

        return shared;

     }

     if(![super init]) return  nil;

     NSMutableArray  *array = [[NSMutableArray alloc] init];

     [array addObject:@"http://www.google.com"];

     [array addObject:@"http://www.apple.com"];

     [array addObject:@"http://www.yahoo.com"];

     [array addObject:@"http://www.zarrastudios.com"];

     [array addObject:@"http://www.macosxhints.com"];

     urlArray = array;

     queue = [[NSOperationQueue  alloc] init];

     shared = self;

     return self;

}

- (void)applicationDidFinishLaunching:(NSNotification *)aNatification

{

     for(NSString *urlString in urlArray)

     {

          NSURL  *url = [NSURL URLWithString:urlString];

          PageLoadOperation  *plo = [[PageLoadOperation alloc] initWithURL:url];

          [queue  addOperation:plo];

          [plo  release];

     }

}


- (void)dealloc

{

     [queue  release];

     [super dealloc];

}


+ (id)shared

{

     if(!shared){

       [[AppDelegate alloc] init];

     }

     return  shared;

}


- (void)pageLoaded:(NSXMLDocument *)document

{

    NSLog(@"%s Do something with the XMLDocuemt:%@",_cmd,document);

}

@end

你可能感兴趣的:(iOS多线程开发(六)---NSOperation/NSOperationQueue)