如果你正在做繁重的計算,可能產生一個新的線程是一個好主意。
在這裏,我有一個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