如何在uitableviewcell中设置来自服务器的图像路径

时间:2014-12-10 10:56:52

标签: ios uitableview uiimageview

我正在制作一个应用程序,其中我从服务器和数据图像路径中获取数据也即将到来,但当我将图像设置为我的tableview单元格应用程序将变得太沉重可能bi我没有正确设置图像下面是我的样本代码提前代码:)

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *tableviewidentifier = @"cell";
    tablecellTableViewCell *cell= [self.activitiesTableView_ dequeueReusableCellWithIdentifier:tableviewidentifier];

    if(cell==nil)
    {
        cell = [[tablecellTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:tableviewidentifier];
    }if(indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section] - 1){
        // [[cell textLabel] setText:@"Load more records"];
    }

    UILabel *valuedate = (UILabel *)[cell viewWithTag:21];
    UILabel *msg = (UILabel *)[cell viewWithTag:22];
    UILabel *date = (UILabel *)[cell viewWithTag:23];
    UILabel *time = (UILabel *)[cell viewWithTag:24];
    valuedate.text=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"offerTitle"];
    msg.text=@"How are you?";
    NSString *img=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"offerPhoto"];// here i am getting image path
     UIImage *img1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:img]]];
    cell.imageView.image=img1;// here i am setting image due to which app is so heavy and stuck


    return cell;
}

4 个答案:

答案 0 :(得分:2)

请勿使用imageWithData:来设置图片。它是同步的,会让你的应用运行缓慢。

而不是使用SDWebImage

你只需要做以下事情:

  1. 将SDWebImage文件夹转储到您的项目中。

  2. 导入UIImageView+WebCache.h

  3. 使用以下设置图片:sd_setImageWithURL:

  4. OR

    GCD (Grand Central Dispatch) and sending asynchronous requests。代码从HERE复制。

    首先实现以下方法。

    - (void)downloadImageWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, UIImage *image))completionBlock
    {
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [NSURLConnection sendAsynchronousRequest:request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                                   if ( !error )
                                   {
                                        UIImage *image = [[UIImage alloc] initWithData:data];
                                        completionBlock(YES,image);
                                    } else{
                                        completionBlock(NO,nil);
                                    }
                               }];
    }
    

    然后在cellForRowAtIndexPath

    [self downloadImageWithURL:your_url completionBlock:^(BOOL succeeded, UIImage *image) {
                if (succeeded) {
                    // change the image in the cell
                    cell.imageView.image = image;
    
    
                }
            }];
    

答案 1 :(得分:1)

首先,您调用dataWithContentsOfURL:函数,这将使应用程序无响应,因为您在主线程上调用它。要使其响应,您需要创建一个自定义单元格YourCell并在YourCell.h中声明一个方法

@interface YourCell : UITableViewCell
{
    UIImage *_cImage;
}

- (void)downloadImageFromURL:(NSURL *)imageUrl;
@end

现在在YourCell.m中你需要这样做:

- (void)downloadImageFromURL:(NSURL *)imageUrl
{
    if (_cImage != nil)
    {
        self.imageView.image = _cImage;
    }
    else
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        _cImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];

        dispatch_sync(dispatch_get_main_queue(), ^{
                self.imageView.image = _cImage;
            });
        });
    }
}

现在来自cellForRowAtIndexPath:您只需要调用downloadImageFromURL:YourCell的函数并将imageUrl传递给它,并负责下载并显示图像。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier= @"YourCell";
    YourCell *cell = (YourCell *)[self.activitiesTableView_ dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"YourCell" owner:self options:nil] objectAtIndex:0];
    }

    // Set your UILabels as before.....

    NSString *imagePath=[[self.inboxmessagesarray objectAtIndex:indexPath.row] objectForKey:@"offerPhoto"];
    [cell downloadImageFromURL:[NSURL URLWithString:imagePath]];

    return cell;        
}

如果您有任何问题,请与我们联系。

答案 2 :(得分:1)

尝试以下代码,希望这有助于你。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
   __block  tablecellTableViewCell *cell= [self.activitiesTableView_ dequeueReusableCellWithIdentifier:tableviewidentifier];
   if(cell==nil)
   {
      cell = [[tablecellTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:tableviewidentifier];
   }
   if(indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section] - 1)
   {
      // [[cell textLabel] setText:@"Load more records"];
   }
   UILabel *valuedate = (UILabel *)[cell viewWithTag:21];
   UILabel *msg = (UILabel *)[cell viewWithTag:22];
   UILabel *date = (UILabel *)[cell viewWithTag:23];
   UILabel *time = (UILabel *)[cell viewWithTag:24];
   valuedate.text=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"offerTitle"];
   msg.text=@"How are you?";

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{     
   NSString *img=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"offerPhoto"];// here i am getting image path
   NSURL *url = [NSURL URLWithString:img];
   NSData * imageData = [NSData dataWithContentsOfURL:url];
   UIImage *image = [UIImage imageWithData:imageData];

   dispatch_sync(dispatch_get_main_queue(), ^{ //in main thread update the image
    cell.imageView.image = image;
    cell.textLabel.text = @""; //add this update will reflect the changes 
    });
  });
 return cell;
}

修改 为了重复使用下载的图像,您可以将它们保存在磁盘上,或者只是将它们保存在某些位置,例如在字典中用于临时使用

在下面的代码中我采用了一个示例字典,强大的下载图像以行为键

@interface ViewController ()
{
    NSMutableDictionary *imagesDictionary; //lets declare a mutable dictionary to hold images 
}

在这个方法中只是初始化它

- (void)viewDidLoad {
    [super viewDidLoad];
    // rest of your code
    //...........
    //
    imagesDictionary = [[NSMutableDictionary alloc]init]; //initilise 
 }
索引中的

此方法只是将下载的图像添加到字典中,以便将相应的行作为键

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {
     __block  tablecellTableViewCell *cell= [self.activitiesTableView_ dequeueReusableCellWithIdentifier:tableviewidentifier];
    if(cell==nil)
    {
       cell = [[tablecellTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:tableviewidentifier];
    }
   if(indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section] - 1)
   {
      // [[cell textLabel] setText:@"Load more records"];
   }
   __block NSString *row = [NSString stringWithFormat:@"%d",indexPath.row]; //add this

   UILabel *valuedate = (UILabel *)[cell viewWithTag:21];
   UILabel *msg = (UILabel *)[cell viewWithTag:22];
   UILabel *date = (UILabel *)[cell viewWithTag:23];
   UILabel *time = (UILabel *)[cell viewWithTag:24];
   // valuedate.text=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"offerTitle"];
   msg.text=@"How are you?";
   if(![[imagesDictionary allKeys] containsObject:row]) //if image not found download and add it to dictionary
   {
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
       // NSString *img=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"offerPhoto"];// here i am getting image path
        NSURL *url = [NSURL URLWithString:img];
        NSData * imageData = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:imageData];

        dispatch_sync(dispatch_get_main_queue(), ^{ //in main thread update the image
             [imagesDictionary setObject:image forKey:row]; //sorry, while editing to your code i forgot to add this 
            cell.imageView.image = image;
            cell.textLabel.text = @""; //add this update will reflect the changes
             NSLog(@"loading and addig to dictionary");
        });
    });
  }
  else
  {
    cell.imageView.image = [imagesDictionary objectForKey:row];
    NSLog(@"retriving from dictioary");
  }
  return cell;
}

答案 3 :(得分:0)

UIImageView *img1 = (UIImageView *)[cell viewWithTag:104];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            img1.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:img]]];
        });
    });

发送图像的异步请求。在图像加载之前,执行此操作不会阻止UI。