基本上我正在制作一个从网上下载的图片库。
所以 - 当用户滚动时,会下载新图像。
请注意,代码非常简单,只是为了向您展示我的意思
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// If new page then:
[self loadNextPicture];
}
-(void)loadNextPicture
{
NSString *url=@"http://www.example.com/image.png";
NSURL *imageURL = [NSURL URLWithString:url];
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage *nextImage = [UIImage imageWithData:imageData];
myUIImageView.image=nextImage;
}
我的问题是,每次用户滚动到新页面时,应用程序会在下载图像时冻结大约一秒钟。有没有办法可以在后台下载它,以便下载时应用程序不会冻结?
对这件事情表达每一个想法。
Andreas:)
答案 0 :(得分:2)
[self performSelectorInBackground:@selector(loadNextPicture) withObject:nil];
答案 1 :(得分:0)
此小类别会将图像加载到背景中,并在图像准备就绪后显示。
@interface UIImageView (BackgroundUrlImage)
- (void)loadURL:(NSURL *)url;
- (void)loadURLWithString:(NSString *)urlString;
- (void)backgroundLoadURL:(NSURL *)url;
- (void)backgroundLoadURLWithString:(NSString *)urlString;
@end
@implementation UIImageView (BackgroundUrlImage)
- (void)loadURL:(NSURL *)url
{
NSError* error = nil;
NSData *imageData = [[NSData alloc] initWithContentsOfURL:url options:0 error:&error];
// TODO: check error!
[imageData release];
UIImage *image = [[UIImage alloc] initWithData:imageData];
[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
[image release];
}
- (void)loadURLWithString:(NSString*)urlString
{
NSURL *url = [NSURL URLWithString:urlString];
if (url != nil)
{
[self loadURL:url];
}
}
- (void)backgroundLoadURL:(NSURL *)url
{
[self performSelectorInBackground:@selector(loadURL:) withObject:url];
}
- (void)backgroundLoadURLWithString:(NSString *)urlString
{
NSURL *url = [NSURL URLWithString:urlString];
if (url != nil)
{
[self backgroundLoadURL:url];
}
}
@end
在您的示例代码中,您现在可以将loadNextPicture减少为:
- (void)loadNextPicture
{
NSString *url=@"http://www.example.com/image.png";
[myUIImageView backgroundLoadURLWithString:url];
}
答案 2 :(得分:0)
使用NSURLConnection以异步方式加载数据。
答案 3 :(得分:-1)
您需要使用NSOperation执行此操作,以便它在与UI线程不同的线程上发生。如果您愿意,可以使用AllSeeingI(http://allseeing-i.com/ASIHTTPRequest/)或AFNetworking等库。