如果你正在做繁重的计算,可能产生一个新的线程是一个好主意。
在这里,我有一个activityIndicator显示,并在后台线程开始大XMLPARSE操作:
- (void) setSearchParser {
activityIndicator = [[ActivityIndicatorView alloc] initWithActivity];
[self.view addSubview:activityIndicator];
[NSThread detachNewThreadSelector:@selector(getSearchResults:) toTarget:self withObject:[searchParser retain]];
}
那么getSearchResults方法:
- (void) getSearchResults: (SearchResultParser *) parser {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[parser startParser];
[self performSelectorOnMainThread:@selector(searchResultsReady:) withObject:[parser data] waitUntilDone:NO];
[pool release];
}
所以,首先创建一个新的线程:
[NSThread detachNewThreadSelector:@selector(getSearchResults:) toTarget:self withObject:[searchParser retain]];
这意味着getSearchResults中的所有代码都将是在另一个线程上执行。 getSearchResults也传递了一个“searchParser”的参数,即一个只需startParse的大对象就可以开始调用它。
这是在getSearchResults中完成的。当[parser startParser]完成时,结果被传回到名为“searchResultsReady”的主线程方法,并释放线程自动释放池。
从我的解析器开始它完成的所有时间,灰色视图覆盖了屏幕上的一个activityIndicator。
你可以有小activityIndicator I类写道:
-(id) initWithActivity {
[self initWithFrame:[self bounds]];
[self setBackgroundColor:[UIColor blackColor]];
[self setAlpha:0.8];
activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityView.center = CGPointMake(160, 240);
[self addSubview:activityView ];
[activityView startAnimating];
return self;
}
- (void) dealloc {
[activityView release];
[super dealloc];
}
希望它可以帮助你,即使线程似乎有点混乱,他们可以帮助使UI不冻结,这一点特别重要在iPhone上。
这帮助我解决了一个完全不相关的问题。谢谢! – 2011-03-15 23:34:28