2017-08-21 5 views
0

J'ai un problème avec ma tableView.
Lorsque je me déplace fréquemment entre ChatListViewController et detailViewcontroller, je tombe en panne et je reçois une erreur dans ListViewController.
Mais je ne sais pas où mes données le font planter.
Je suppose que j'utilise GCD pour y arriver ou non?
Vous avez des conseils pour l'éviter?
Merci.
Get Erreur "Index hors de portée" Lorsque je pousse/recule fréquemment le viewcontroller dans le périphérique réel - Swift

journal des blocages:
erreur fatale: Index hors de portée ![enter image description here ![enter image description here

Modèle:

class ChatroomList:Model { 

    var all:[Chatroom] { 
    var rooms:[Chatroom] = [Chatroom]() 
    self.chatrooms.forEach({ (id,chatroom) in 
     if showType.contains(chatroom.type) { 
      rooms.append(chatroom) 
     } 
    }) 
    return rooms 
    } 
} 

ViewController:

import RxCocoa 
import RxSwift 
import Alamofire 

class ListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {      

    let chatrooms:ChatroomList = ChatroomList() 
    var list:[Chatroom] = [Chatroom]() 
    var subscribe:Disposable? 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    self.tableView.dataSource = self 
    self.tableView.delegate = self 

    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     subscribe = rooms.notifySubject.subscribe({ json in 
       self.loadContents() 
     }) 
     self.loadContents() 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 

     subscribe?.dispose() 
    } 

    func loadContents() { 

     var idList:[String] = [] 

     self.list.removeAll() 
     self.list = chatrooms.all 

     guard self.list.isEmpty == false else { 
      return 
     } 

     DispatchQueue.global().async() { 

      self.list = self.list.filter { (chatroom) -> Bool in 
       if chatroom.id.isEmpty { 
        return true 
       } 
       if idList.contains(chatroom.id) { 
        return false 
       } 
       idList.append(chatroom.id) 
       return true 
      } 

      self.list.sort(by: { (a,b) in 
       if a.message.datetime.isEmpty { 
        return false 
       } 

      return a.message.datetime > b.message.datetime 
     }) 

     DispatchQueue.main.async() { 

      self.tableView.reloadData() 
     } 
     } 
    } 
} 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return list.count 
} 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if list[indexPath.row].type == .city { 

     let cell: ChatroomCityTableViewCell = ChatroomCityTableViewCell(style: .default, reuseIdentifier: nil) 

     cell.loadByCityChatroom(chatroom: list[indexPath.row], cityId: list[indexPath.row].cityId) 

     return cell 
    }else{ 

     let cell: ChatroomTableViewCell = ChatroomTableViewCell(style: .default, reuseIdentifier: nil) 
     cell.loadByChatroom(chatroom: list[indexPath.row]) 

     return cell 
    } 
} 
+0

poster votre journal de panne, et votre crash stacktrace –

+0

Je n'ai pas beaucoup de crash journal.Je suis à jour. –

+0

Une erreur se produit dans ChatroomListViewController? – 3stud1ant3

Répondre

0

Activer Zombie objets dans votre système.

Sélectionnez votre schéma d'application -> Exécuter -> Diagnostics -> Vérifier les objets Zombie.

Lancez votre application maintenant. Cela vous donnerait des informations plus précises sur votre accident.

enter image description here

Hope this helps :)

+0

Ne m'aidez pas.Merci –

+0

@tolerate_Me_Thx ok. activer les objets zombies vous fournira la raison et la méthode de l'accident où elle s'est produite. Vous avez mentionné l'index hors gamme, cela se passe-t-il dans la méthode cellForRowAt? – Basheer

0

Vous pouvez trouver beaucoup d'informations sur Internet en ce qui concerne le référencement self l'intérieur d'une fermeture et ses implications. Sans entrer dans ce détail, je recommanderais simplement d'utiliser [weak self] où vous référencez self dans une fermeture. Quelque chose comme

closure { [weak self] _ in 
    self?.whatever() 
}