是的,你可以使用辅助线程,并做了很多工作,或者你可以使用苹果给我们的东西。
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