我在一些论坛帖子中发现了将图像从网站保存到iphone应用程序并且我正在使用它,因为一切都没问题,除了一件事,速度。
图像大约是10KB,当有一个图像时,它以正常速度下载,但是当有15-20个图像时,它非常慢。
我知道必须有办法以另一种方式更快地下载图像因为我的iPhone上有一些新闻应用程序和这个应用程序下载15-20篇文章像我一样的图像(我说我喜欢我因为质量相同或更好)并且快5秒(或更多)。
所以我的问题是;还有另一种更快的方式从网站下载图像到iPhone应用程序吗?
这是我的代码:
#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
#import "downloadImage.h"
@interface downloadImage ()
@end
@implementation downloadImage
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *imgUrl = @"http://somesite.com/someimage.jpg";
dispatch_async(kBgQueue, ^{
[self performSelectorOnMainThread:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:YES];
});
}
-(void)downloadImageFromWeb:(NSString *)imgUrl{
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]]];
NSArray *parts = [imgUrl componentsSeparatedByString:@"/"];
NSString *imgFilename = [parts lastObject];
[self saveImage:image:imgFilename];
}
- (void)saveImage:(UIImage*)image:(NSString*)imageName {
NSData *imageData = UIImageJPEGRepresentation(image, 100);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:
imageName];
[fileManager createFileAtPath:fullPath contents:imageData attributes:nil];
//NSLog(@"image saved");
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
答案 0 :(得分:1)
1)从普通浏览器检查此图像的实际加载时间,这可能是服务器端问题
2)尝试使用一些经过验证的代码,例如AsyncImageView,看看你的代码是否有任何不同。
3)取消保存并再次测试。如果它变得更快,则对保存进行子线程处理(但是,创建这么多线程并不是一个好主意)
4)为什么在主线程上执行加载选择器?在后台线程上执行,稍后更新主要图像上的图像。现在你调度它的方式阻塞了主线程。
答案 1 :(得分:1)
下载图片取决于speed
的{{1}}以及internet
。
如果在下载时不想打扰server
UI
,请在application
中执行下载:
Background process
答案 2 :(得分:0)
dataWithContentsOfURL
是同步通话。我们NSConnection
和connectionDidFinishedLoading
获取主要问题并将图片设置为您想要的位置。这将在后台运行
答案 3 :(得分:0)
使用dispatch_async
是更好的选择。但在你的情况下,这一行会导致问题:
dispatch_async(kBgQueue, ^{
[self performSelectorOnMainThread:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:YES];
});
更改代码如下:
dispatch_async(kBgQueue, ^{
[self downloadImageFromWeb:imgUrl];
});
请参阅以下文件:
这是一个很好的Tutorial,你可以处理这种情况。