iOS多线程开发(六)---NSOperation/NSOperationQueue
来源:互联网 发布:淘宝靠谱手机店 编辑:程序博客网 时间:2024/05/16 19:03
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
- iOS多线程之NSOperation/NSOperationQueue
- iOS多线程开发——NSOperation/NSOperationQueue浅析
- Ios多线程编程:NSOperation和NSOperationQueue
- iOS多线程 NSOperation和NSOperationQueue的使用
- iOS多线程——NSOperation & NSOperationQueue
- ios多线程之NSOperation和NSOperationQueue - hshd
- iOS多线程编程NSOperation和NSOperationQueue
- iOS开发-NSOperation和NSOperationQueue的使用
- 《多线程之NSOPeration/NSOperationQueue》
- 多线程NSOperation和NSOperationQueue
- IOS开发 - 多线程 NSOperation
- iOS 之 NSOperation,NSOperationQueue
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- IOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- 小强的HTML5移动开发之路(15)——HTML5中的音频
- iOS多线程开发(五)---GCD(Grand Central Dispatch)
- iOS移除地图标注大头针
- iOS多线程开发(五)---GCD(二)block && Grand Central Dispatch
- 运用EnvDTE获取Visual Studio实例并动态修改解决方案和项目
- iOS多线程开发(六)---NSOperation/NSOperationQueue
- 【北京圣思园学习笔记】第07讲: 流程控制语句 续(Flow Control Statement Cont.)
- fckeditor2.6.6 java上传图片到绝对路径的配置
- 百度创始人李彦宏:互联网的下一章
- Hadoop平台研究和搭建
- win7 php开发环境搭建
- android AlertDialog显示错误 Unable to add window token null is not for an application
- Chinaunix论坛“Linux/UNIX系统编程,系统程序员成长的基石?”话题讨论的回复
- 【北京圣思园学习笔记】第08讲:理解面向对象程序设计