3

我有一个NSMutableArray带有一些图片网址的。图像的大小在 12KB 到 6MB 之间。我使用AsycImageView类和实现,但是当大图像下载应用程序崩溃时,我在该类中为 maxsize 提供了 6*1024*1024 (6MB),将时间间隔从 60.0 秒增加到 180.o 秒,但没有用。我收到错误“收到内存警告”,当应用程序崩溃时自动从设备中删除连接,但在模拟器中没有崩溃。

4

5 回答 5

3

用于. GCD_lazy loading

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
 dispatch_async(queue, ^{
       NSString *strURL = url here;
       NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
       UIImage *image = nil;
       if(data)
        image = [UIImage imageWithData:data];
      dispatch_sync(dispatch_get_main_queue(), ^{
           //now use image in image View  or anywhere according to your requirement.
           if(image)
             yourImgView = image
      });
 });
于 2013-05-03T06:32:02.867 回答
3

您可以使用multiThreading. 这是一个代码

- (UIImageView *)getImageFromURL:(NSDictionary *)dict
{
    #ifdef DEBUG
    NSLog(@"dict:%@", dict);
    #endif

    UIImageView *_cellImage = nil;
    _cellImage = ((UIImageView *)[dict objectForKey:@"image"]);
    NSString *strURL = [dict objectForKey:@"imageurl"]);

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];

    #ifdef DEBUG
    NSLog(@"%i", data.length);
    #endif

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dataFilePath = [NSString stringWithFormat:@"%@.png", [documentsDirectory stringByAppendingPathComponent:[dict objectForKey:@"imageid"]]];

    if (data) // i.e. file exist on the server
    {
        [data writeToFile:dataFilePath atomically:YES];
        _cellImage.image = [UIImage imageWithContentsOfFile:dataFilePath];
    }
    else // otherwise show a default image.
    {
        _cellImage.image = [UIImage imageNamed:@"nouser.jpg"];
    }
    return _cellImage;
}

并像这样调用这个方法cellForRowAtIndexPath

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:imageURL, @"imageurl", self.imgPhoto, @"image", imageid, @"imageid", nil];
    [NSThread detachNewThreadSelector:@selector(getImageFromURL:) toTarget:self withObject:dict];

该代码将开始在多个线程中获取图像并将图像本地保存到文档文件夹。如果已经存在同名的图像,也不会再次下载。希望这可以帮助

于 2013-05-03T06:17:31.780 回答
1

您可以使用 GCD 异步下载图像。使用以下代码,

__block NSData *imageData;

dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL);
dispatch_async(myQueue, ^{
  //load url image into NSData
  imageData = [NSData dataWithContentsOfURL: your_image_URL];
  if(imageData) {
    dispatch_sync(dispatch_get_main_queue(), ^{
        //convert data into image after completion
        UIImage *img = [UIImage imageWithData:imageData];
        //do what you want to do with your image
    });
 } else {
      NSLog(@"image not found at %@", your_image_URL);
 }
});
dispatch_release(myQueue);

有关详细信息,请参阅dispatch_queue_t

于 2013-05-03T06:32:09.220 回答
0

我建议替换 API SDWebImage,它为 UIImageVIew 提供了一个类别,支持来自网络的远程图像。你也可以有一个占位符图像,直到图像被异步下载。它易于使用并节省大量工作

于 2013-05-03T06:34:57.713 回答
0

您的问题似乎更多是内存使用问题,而不是性能问题。

如果你真的想异步下载图像,我建议你使用AFNetworking的UIImageView 类别,它已经​​过全面测试并且维护得很好。

然而,在这里您会在您的设备上遇到内存警告(它的内存显然比在您的 Mac 上运行的模拟器少得多)。

所以我会首先使用静态分析器:

在此处输入图像描述

查看是否存在泄漏,然后运行泄漏仪器进行追踪。

希望这可以帮助。

于 2013-05-03T07:55:15.460 回答