ios - 当我在真实设备中频繁推送/返回 View Controller 时出现错误 "Index out of range"- Swift

标签 ios swift tableview nsindexpath

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

崩溃日志:
fatal error :索引超出范围 ![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
    }
}

View Controller :

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

最佳答案

在您的方案中启用僵尸对象。

选择您的应用程序方案 -> 运行 -> 诊断 -> 检查僵尸对象。

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

enter image description here

希望这有帮助:)

关于ios - 当我在真实设备中频繁推送/返回 View Controller 时出现错误 "Index out of range"- Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45789171/

相关文章:

swift - 奇怪的 tableView.reloadData() 行为

ios - 我如何等待 NSStream 打开或失败?

ios - 自动布局问题 : Prevents Image from loading?

ios - 从第一个 UIAlertController 打开第二个 UIAlertController

ios - 在 IOS 中将选项卡与 tableview 滚动同步

java - 无法从 Soap 响应中的节点检索文本内容

ios - 将日期格式为 "2015-11-09 06:54:00 UTC"的日期字符串转换为 NSDate

ios - 如何缩放我的 imagePickerController 相机以使其填满整个屏幕?

ios - 如何根据 Swift 中的字符串创建对象?

ios - 使用 UserDefault 时电子邮件主题显示为 nil