获取错误“索引超出范围”当我经常在真实设备中推/看viewcontroller时 - Swift

时间:2017-08-21 04:08:49

标签: ios swift tableview nsindexpath

我的tableView有问题 当我经常在ChatListViewController和detailViewcontroller之间推送/返回时,我会崩溃并在ListViewController中出错。
但我不知道我的数据在哪里崩溃 我猜我是否使用GCD来实现它? 有什么建议可以避免吗?
感谢。

崩溃日志:
    致命错误:索引超出范围     ![enter image description here     ![enter image description here

型号:

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
    }
}

2 个答案:

答案 0 :(得分:0)

在您的方案中启用Zombie Objects。

选择您的应用方案 - >运行 - >诊断 - >检查Zombie Objects。

立即运行您的应用。这将为您提供有关崩溃的更准确信息。

enter image description here

希望这有助于:)

答案 1 :(得分:0)

您可以在互联网上找到关于在闭包内引用self及其含义的大量信息。在不详细说明的情况下,我建议在封闭内部引用[weak self]的地方使用self。像

这样的东西
closure { [weak self] _ in
    self?.whatever()
}