2016-03-21 15 views
0

私はJSONが残っているで埋め込まれたUITableViewをJSON内に持っています。各セルの画像をダウンロードする必要があるURLがあります。私の問題は、いったんイメージをダウンロードすると、チャートを投げたときにイメージが再ダウンロードされ、セルが正しいイメージをダウンロードするまで間違ったイメージを持つことです。一度ダウンロードした画像を適切なセルに保存しておくにはどうすればよいですか?URL(iOS)からダウンロードした写真でテーブルを埋め込む方法は?

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 


} 

答えて

0

あなたは...このためにカスタムセルを作るべきあなたがこの方法で... prepareForReuseという名前のセルメソッドをオーバーライドすることができますintialize cell.imageview.image = nilを;: これは私のコードですあなたのimageview.imageはサーバからダウンロードされた画像まではゼロになります。

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

セルが外に出たときには、それができません。それは再現されたビューに来ると再び破壊されます。あなたはライブラリであるSDWebImageを使うことができます。これは、マシンのメモリに一度イメージを保存するのに役立ちます。セルがリロードされたときに何度もネットワークリクエストを行う必要はありません。

0

このように考える:のviewDidLoad1-にあなたは私たちが最初の2のオプションを持っている画像をダウンロードする必要がある点が、画像天気を確認することで到達したとき、あなたがyourUrlを呼び出す場合は、ディスクにキャッシュされ、あるいは全くれます何が、その後ここで私は使用方法

を、それをダウンロードして行くと、ディスクにキャッシュされた場合は[はい、ディスクからそれを得るん:

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

このヘルプを願っています
関連する問題