2015-12-28 2 views
0

У меня есть tableViewCell, который содержит 8 изображений, разделенных на два блока (4 изображения в каждом блоке). Эти изображения загружаются асинхронно и сохраняются в массиве, а затем используются в tableViewCell's cellForRowAtIndexPath для заполнения изображений. Я перезагружаю tableView, когда все изображения для одного блока добавлены в массив в словаре (groupTOImages). То, как я это делаю, я выхожу из строя несогласованными результатами с загрузкой данных. Некоторые изображения загружаются в места, где их не должно быть. Есть ли способ загрузить изображения и получить согласованные результаты в tableViewCell.Update TableViewCell с асинхронными данными

var groupNames = [NSManagedObject]() 
var groupTOPeople = [NSManagedObject: [String]]() 
var groupTOImages = [NSManagedObject: [UIImage]]() 
func getGroups() { 
    ... 
    for group in groupNames { 
      groupTOImages[group] = [] 
      if let people = groupTOPeople[group] { 
       var mycount = 0 
      for peeps in people { 
       InstagramEngine.sharedEngine().getUserDetails(peeps, withSuccess: { user in 
        if let ppic = user.profilePictureURL { 
         let picUrl = ppic.absoluteString 
         print(picUrl) 
         ImageLoader.sharedLoader.imageForUrl(picUrl) { (image, url) ->() in 
          self.groupTOImages[group]?.append(image!) 
          mycount++ 
          if mycount == people.count { 
           self.tableView.reloadData() 

          } 
         } 
        } else { 
         self.groupTOImages[group]?.append(UIImage()) 
         mycount++ 
         if mycount == people.count { 
          self.tableView.reloadData() 
         } 
        } 


        }, failure: nil) 
      } 
     } 

     } 

var counter = 0 
var groupCount = 0 
var groupCounter = 0 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cellInfo = GroupCellsArray[indexPath.section] 
    ... 
    case .userGroups: 
      let cell = tableView.dequeueReusableCellWithIdentifier(cellInfo.description, forIndexPath: indexPath) as! GroupTableViewCell 
      if groupNames.count > 0 { 
       var gp = groupNames[groupCounter] 
       switch counter { 
        case 0: 
         cell.firstTitle.text = (gp.valueForKey("name") as! String) 
         if let ourImages = groupTOImages[gp] { 
         for image in ourImages { 
          print(image.description) 
          print("groupCount \(groupCounter)") 
          cell.firstUserButtons[groupCount].layer.borderWidth = 0 
          cell.firstUserButtons[groupCount].setImage(image, forState: .Normal) 
          groupCount++ 
          if groupCount == ourImages.count { 
           groupCount = 0 
           counter++ 
           groupCounter++ 
           gp = groupNames[groupCounter] 
          } 
         } 
        } 
        case 1: 
        if let title = gp.valueForKey("name") as? String { 
         cell.secondTitle.text = title 
         if let ourImages = groupTOImages[gp] { 
          for image in ourImages { 
           cell.secondUserButtons[groupCount].layer.borderWidth = 0 
           cell.secondUserButtons[groupCount].setImage(image, forState: .Normal) 
           groupCount++ 
           if groupCount == ourImages.count { 
            groupCount = 0 
            counter = 0 
            groupCounter++ 
            gp = groupNames[groupCounter] 
           } 
          } 

         } 
        } else { 
         cell.secondTitle.text = "Title" 
        } 
       default: 
        break 
       } 

Каждая строка выглядит как на картинку ниже: enter image description here

код с использованием ImageLoader в cellForRowAtIndexPath:

var counter = 0 
     for group in groupNames { 
      print("in the second") 
      groupTOImages[group] = [] 
      if let people = groupTOPeople[group] { 
       var mycount = 0 
      for peeps in people { 
       InstagramEngine.sharedEngine().getUserDetails(peeps, withSuccess: { user in 
        if let ppic = user.profilePictureURL { 
         let picUrl = ppic.absoluteString 
         self.groupTOImages[group]?.append(picUrl) 
         counter++ 
         mycount++ 
         if counter == self.groupNames.count && mycount == people.count 
         { 
          dispatch_async(dispatch_get_main_queue()) { 
           self.tableView.reloadData() 
          } 
         } 
        } else { 
         self.groupTOImages[group]?.append(nil) 
         counter++ 
         mycount++ 
         if counter == self.groupNames.count && mycount == people.count 
         { 
          dispatch_async(dispatch_get_main_queue()) { 
           self.tableView.reloadData() 
          } 
         } 
        } 

       }, failure: nil) 
      } 
     } 


if groupNames.count > 0 { 
       var gp = groupNames[groupCounter] 
       print("counter!!!!") 
       print("groupCount \(counter)") 
       switch counter { 
        case 0: 
         if let ourImages = groupTOImages[gp] { 
          cell.firstTitle.text = (gp.valueForKey("name") as! String) 
          print(cell.firstTitle.text) 
          for image in ourImages { 
           if let url = image { 
            print("I get in here") 
            ImageLoader.sharedLoader.imageForUrl(url) { (image, url) ->() in 
            cell.firstUserButtons[self.groupCount].layer.borderWidth = 0 
            cell.firstUserButtons[self.groupCount].setImage(image, forState: .Normal) 
             self.groupCount++ 
             if self.groupCount == ourImages.count { 
              self.groupCount = 0 
              self.counter++ 
              self.groupCounter++ 
              gp = self.groupNames[self.groupCounter] 
             } 
            } 

           } else { 
            self.groupCount++ 
            if self.groupCount == ourImages.count { 
             self.groupCount = 0 
             self.counter++ 
             self.groupCounter++ 
             gp = self.groupNames[self.groupCounter] 
            } 
           } 
          } 
         } 
       case 1: 
        if let title = gp.valueForKey("name") as? String { 
         cell.secondTitle.text = title 
         if let ourImages = groupTOImages[gp] { 
          for image in ourImages { 
           if let url = image { 
            ImageLoader.sharedLoader.imageForUrl(url) { (image, url) ->() in 
            cell.secondUserButtons[self.groupCount].layer.borderWidth = 0 
            cell.secondUserButtons[self.groupCount].setImage(image, forState: .Normal) 
            self.groupCount++ 
             if self.groupCount == ourImages.count { 
              self.groupCount = 0 
              self.counter++ 
              self.groupCounter++ 
              gp = self.groupNames[self.groupCounter] 
             } 
            } 
           } else { 
            self.groupCount++ 
            if self.groupCount == ourImages.count { 
             self.groupCount = 0 
             self.counter = 0 
             self.groupCounter++ 
             gp = self.groupNames[self.groupCounter] 
            } 
           } 
          } 

         } 
        } else { 
         cell.secondTitle.text = "Title" 
        } 
+0

Был ли ваш вызов 'reloadData()' в 'dispatch_async (dispatch_get_main_queue())'? Если да, то, вероятно, просто плохая передача повторного использования 'tableView' – Tj3n

+0

@ Tj3n У меня есть' reloadData() ', вызываемый в завершении закрытия ImageLoader, чтобы гарантировать, что этот просмотр таблицы только перезагружается, когда все изображения загружены для блока. Где бы 'dispatch_async (dispatch_get_main_queue()' пришел в игру? – wxcoder

+0

U должен вызывать 'dispatch_async (dispatch_get_main_queue()' всякий раз, когда вы хотите работать с материалами UI, и вызывайте его каждый раз, когда что-то, связанное с пользовательским интерфейсом, нужно обновлять, как 'dispatch_async (dispatch_get_main_queue() {self.tableView.reloadData()} ' – Tj3n

ответ

0

Вы должны заменить self.tableView.reloadData() с

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    self.tableView.reloadData() 
}) 

Надеется, что это помогает !

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