0

我在一些关于将图像从网站保存到 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
4

4 回答 4

1

1)从普通浏览器检查此图像的实际加载时间,这可能是服务器端问题

2)尝试为此使用一些经过验证的代码,例如AsyncImageView并查看与您的代码是否有任何区别。

3)删除保存并再次测试。如果速度更快,则对保存进行子线程化(但是,创建这么多线程并不是一个好主意)

4)为什么要在主线程上执行负载选择器?在后台线程上执行此操作,然后在主线程上更新图像。您现在调度它的方式会阻塞主线程。

于 2012-10-30T11:56:34.187 回答
1

下载图像取决于speedinternet以及server.

如果不想在下载时打扰UI,请在以下位置application执行下载Background process

    [self performSelectorInBackground:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:NO];
于 2012-10-30T11:57:50.613 回答
0
dataWithContentsOfURL 

是同步调用。我们NSConnection并在connectionDidFinishedLoading获取主队列并将图像设置到您想要的任何位置。这将在后台运行

于 2012-10-30T11:57:50.347 回答
0

使用dispatch_async是更好的选择。但在你的情况下,这条线会导致问题:

dispatch_async(kBgQueue, ^{

        [self performSelectorOnMainThread:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:YES];

    });

将代码更改为:

dispatch_async(kBgQueue, ^{

            [self downloadImageFromWeb:imgUrl];

        });

请参考这些文件:

性能:dispatch_async

并发编程指南

这是一个很好的教程,可以帮助您处理这种情况。

于 2012-10-30T13:42:41.717 回答