是的,你可以使用輔助線程,並做了很多工作,或者你可以使用蘋果給我們的東西。
NSURLDownload不會「滯後」你的主線程,你用方法產生它並設置一個endSelector,endSelector將在下載完成時被調用。 產生這樣的輔助線程並不是你真正應該做的。
這裏你從我的應用程序得到了一些代碼,它完美的工作,沒有給予厄運的沙灘球。
- (void)downloadAvatar:(NSString *)URL{
NSURL *url = [[NSURL alloc] initWithString:URL];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
[url release];
NSURLDownload *download = [[NSURLDownload alloc] initWithRequest:request delegate:self];
NSString *path = [[NSString alloc] initWithFormat:@"%@data/%@.jpg",[[BFAppSupport defaultSupport] bfFolderPath],[[xfSession loginIdentity] userName]];
[download setDestination:path allowOverwrite:YES];
[download release];
[path release];
[request release];
}
- (void)downloadDidFinish:(NSURLDownload *)download{
NSString *path = [[NSString alloc] initWithFormat:@"%@data/%@.jpg",[[BFAppSupport defaultSupport] bfFolderPath],[[xfSession loginIdentity] userName]];
NSData *imageData = [[NSData alloc] initWithContentsOfFile:path];
if([imageData length] < 10){
[self performSelector:@selector(downloadAvatar:) withObject:@"http://media.xfire.com/xfire/xf/images/avatars/gallery/default/xfire160.jpg" afterDelay:0.0];
[imageData release];
[path release];
return;
}
NSImage *theImage = [[NSImage alloc] initWithData:imageData];
[imageData release];
[path release];
[yourImage setImage:theImage];
[theImage release];
}
- (void)download:(NSURLDownload *)aDownload didFailWithError:(NSError *)error{
NSLog(@"Avatar url download failed");
}
的代碼是醜了一點,但它不是很難改變它,你得到了你所需要的三兩件事,即開始下載和2處理或錯誤,或完成的方法。 您還可以使用更多的自動釋放對象,但就性能而言,我喜歡在不使用自動釋放對象的情況下使用它。
對不起,但我不確定你是什麼意思或我該怎麼做。你能再解釋一下嗎? – androidnotgenius 2010-03-03 04:24:39
@pureman,你看到鏈接了嗎?這非常簡單 - 您使用'[NSThread detachNewThreadSelector ...]'創建一個具有特定方法的線程,然後在worker線程完成時使用'performSelectorOnMainThread'回調應用程序。 – 2010-03-03 04:32:59
我會在我的答案中添加一些代碼以清除它。 – 2010-03-03 04:34:51