如何在后台将图像从网站保存到iphone应用程序(并快速完成)?

时间:2012-10-30 11:48:02

标签: iphone ios

我在一些论坛帖子中发现了将图像从网站保存到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 个答案:

答案 0 :(得分:1)

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

2)尝试使用一些经过验证的代码,例如AsyncImageView,看看你的代码是否有任何不同。

3)取消保存并再次测试。如果它变得更快,则对保存进行子线程处理(但是,创建这么多线程并不是一个好主意)

4)为什么在主线程上执行加载选择器?在后台线程上执行,稍后更新主要图像上的图像。现在你调度它的方式阻塞了主线程。

答案 1 :(得分:1)

下载图片取决于speed的{​​{1}}以及internet

如果在下载时不想打扰server UI,请在application中执行下载:

Background process

答案 2 :(得分:0)

dataWithContentsOfURL 

是同步通话。我们NSConnectionconnectionDidFinishedLoading获取主要问题并将图片设置为您想要的位置。这将在后台运行

答案 3 :(得分:0)

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

dispatch_async(kBgQueue, ^{

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

    });

更改代码如下:

dispatch_async(kBgQueue, ^{

            [self downloadImageFromWeb:imgUrl];

        });

请参阅以下文件:

Performance : dispatch_async

ConcurrencyProgrammingGuide

这是一个很好的Tutorial,你可以处理这种情况。