【问题标题】:How to fill a table with pictures downloaded from a URL (iOS)?如何用从 URL (iOS) 下载的图片填充表格?
【发布时间】:2016-07-07 20:41:18
【问题描述】:

我有一个UITableView 填充有一个JSON,它通过Alamofire 排出,在JSON 中有我需要下载每个单元格的图像的URL。我的问题是,一旦我下载了图像,当他扔掉图表图像时会重新下载,并且单元格有错误的图像,直到它完成下载正确的图像。如何获取下载后仍存储在正确单元格中的图像? 这是我的代码:

override func viewDidLoad() {
    super.viewDidLoad()
    self.refreshTable()

}
func refreshTable(){
    Alamofire.request(.GET, urlComponent, parameters: nil, encoding:.JSON).responseJSON
        { response in switch response.result {
        case .Success(let JSON):

            let data = JSON as! Dictionary<String, AnyObject>
            for (_,value) in data{
                let object = value as! NSMutableArray
                for item in object{
                    self.arrayData.addObject(item)
                }
            }
            self.tableView.reloadData()
        case .Failure(let error):
            print("Request failed with error: \(error)")
            }
    }

}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if(self.arrayData.count != 0){
        return self.arrayData.count

    }
    else{
        return 0

    }
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CollectionCell
            if(self.arrayData.count != 0){
   let dizionario = self.arrayData.objectAtIndex(indexPath.row) as! NSDictionary
        cell.titolo.text = dizionario.objectForKey("title") as? String
        cell.code.text = dizionario.objectForKey("code") as? String

            let url = NSURL(string:dizionario.objectForKey("img") as! String)!

            Alamofire.request(.GET, url, parameters: nil).responseData
                { response in switch response.result {
                case .Success(let JSON):
                    let data = JSON
                    cell.immagine.image = UIImage(data: data)

                case .Failure(let error):
                    print("Request failed with error: \(error)")

                    }
            }

    }

    return cell


}

【问题讨论】:

    标签: ios json image uitableview alamofire


    【解决方案1】:

    这样想:1-on viewDidLoad 当您到达需要下载图像的地步时调用 yourUrl 我们有 2 个选项首先是检查是否图片是否缓存在磁盘上,如果是,则从磁盘中获取,如果不是,则下载并缓存到磁盘

    这里是我使用的方法:

    UIActivityIndicatorView *view  = [(UIActivityIndicatorView *)cell viewWithTag:500];
    [view setColor:[UIColor colorWithRed:255/255.0 green:198/255.0 blue:39/255.0 alpha:1.0f]];
    [view startAnimating];
    
    menuItem *event  = [self.listOfMenuItem objectAtIndex:index];
    NSString *cachedKey  = event.menuItemUrlImage;
    
    
    
    SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"yourSDImageCache"];
    
    [imageCache queryDiskCacheForKey:cachedKey done:^(UIImage *image, SDImageCacheType cacheType)               {
    
    if (image) {
    
    
        UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    
        recipeImageView.layer.cornerRadius = recipeImageView.frame.size.width/2;
    
        recipeImageView.layer.borderColor = [UIColor colorWithRed:31/255.0 green:97/255.0 blue:51/255.0 alpha:1.0f].CGColor;
    
        CGSize h = CGSizeMake(180, 180);
        recipeImageView.image = [self imageWithImage:image scaledToSize:h :cell];
    
        [view stopAnimating];
    
    
    
    
    
    
    }else{
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
    
            NSURL *url  = [NSURL URLWithString:event.menuItemUrlImage];
    
    
            [[SDWebImageDownloader sharedDownloader]downloadImageWithURL:url options:SDWebImageDownloaderLowPriority progress:^(NSInteger receivedSize, NSInteger expectedSize) {
    
            } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
    
    
    
    
                if (finished && image){
                    [view stopAnimating];
                    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    
                    recipeImageView.layer.cornerRadius = recipeImageView.frame.size.width/2;
    
                    recipeImageView.layer.borderColor = [UIColor colorWithRed:31/255.0 green:97/255.0 blue:51/255.0 alpha:1.0f].CGColor;
    
                    CGSize h = CGSizeMake(180, 180);
                    recipeImageView.image = [self imageWithImage:image scaledToSize:h :cell];
    
    
                    [imageCache setMaxCacheAge:60*60*24];
    
                    [imageCache storeImage:image
                      recalculateFromImage:NO
                                 imageData:data
                                    forKey:event.menuItemUrlImage
                                    toDisk:YES];
                }
            }];
    
    
    
    
    
        });
    }
    }];
    

    SDWebImage希望对您有所帮助

    【讨论】:

      【解决方案2】:

      这是不可能的,因为当一个单元格消失时。当它被重新创建时,它再次被销毁。您可以使用SDWebImage 这是一个库,这将帮助您将图像一次性存储在机器的内存中,当重新加载单元格时,您无需一次又一次地发出网络请求。

      【讨论】:

        【解决方案3】:

        您应该为此创建一个自定义单元格...您可以在其中覆盖名为 prepareForReuse 的单元格方法...在此方法中初始化您 cell.imageview.image = nil;这样您的 imageview.image 将为零,直到从服务器下载图像

        func prepareForReuse()
        {
            cell.imageView.image = nil;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-12
          • 2023-03-08
          • 2016-03-30
          • 2015-09-15
          相关资源
          最近更新 更多