2016-06-07 7 views
0

Я пытаюсь разобрать данные из этого data source. Заголовки обрабатываются правильно и отображаются, но изображения вообще не отображаются и не кэшируются. Ниже мой код MyTableViewController.swift, и классы отдыха в этом вопросе: Parsing image from iTunes using JSON to tableviewcontrollerSwift: картирование кэширования не работает должным образом

class MyTableViewController: UITableViewController { 
@IBOutlet var songsTable: UITableView! 
let viewModel = ViewModel() 
var imageCache = [String:UIImage]() 
var songs = [NSManagedObject]() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.refresh() 
    self.refreshControl = UIRefreshControl() 
    self.refreshControl?.addTarget(self, action: #selector(MyTableViewController.refresh), forControlEvents: .ValueChanged) 

} 

func refresh() { 
    viewModel.fetch { 
     dispatch_async(dispatch_get_main_queue()) { 
      self.tableView.reloadData() 
      self.refreshControl?.endRefreshing() 
     } 
    } 


} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return self.viewModel.numberOfSections() 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.viewModel.numberOfItemsInSection(section) 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MyTableViewCell 
    cell.songTitle.text = self.viewModel.titleForItemAtIndexPath(indexPath) 
    //let song = songs[indexPath.row] 
    //cell.songTitle.text = song.valueForKey("title") as? String 


    let urlString = self.viewModel.imageForItemAtIndexPath(indexPath) 

    let imgURL: NSURL = NSURL(string: urlString)! 
    let request: NSURLRequest = NSURLRequest(URL: imgURL) 
    NSURLConnection.sendAsynchronousRequest(
     request, queue: NSOperationQueue.mainQueue(), 
     completionHandler: {(response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in 
      if error == nil { 
       cell.songImage.image = UIImage(data: data!) 
      } 
    }) 

    let thumbnailURLString = self.viewModel.imageForItemAtIndexPath(indexPath) 
    let thumbnailURL = NSURL(string: thumbnailURLString)! 

    //if image is cached 
    if let img = imageCache[thumbnailURLString] { 
     cell.songImage?.image = img 
     print("image is cached") 
    } 
    else { 
     // The image isn't cached, download the img data 
     // We should perform this in a background thread 
     let request: NSURLRequest = NSURLRequest(URL: thumbnailURL) 
     let mainQueue = NSOperationQueue.mainQueue() 
     NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue, completionHandler: { (response, data, error) -> Void in 
      if error == nil { 
       // Convert the downloaded data in to a UIImage object 
       let image = UIImage(data: data!) 
       // Store the image in to our cache 
       self.imageCache[thumbnailURLString] = image 
       // Update the cell 
       dispatch_async(dispatch_get_main_queue(), { 
        if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as! MyTableViewCell?{ 
         cellToUpdate.songImage?.image = image 
        } 
       }) 
      } 
      else { 
       print("Error: \(error!.localizedDescription)") 
      } 
     }) 
    } 

    return cell 
} 

Спасибо, что нашли время, чтобы прочитать это.

ответ

1

Вы ошибаетесь, но, похоже, работаете. Я мог заставить его работать при условии, я изменил вашу refresh функции на что-то вроде:

func refresh() { 
     viewModel.fetchTitles({[unowned self] _ in 
      self.viewModel.fetchImages({[unowned self] _ in 
       dispatch_async(dispatch_get_main_queue()) { 
        self.tableView.reloadData() 
        self.refreshControl?.endRefreshing() 
       } 
      }) 
     }) 
    } 

Это использует код, который вы размещены в вашем предыдущем вопросе. Вы можете попробовать этот код или отправить код для viewModel.fetch.

+0

Большое вам спасибо: D – Reem

Смежные вопросы