【问题标题】:Handle thousands of socket message in iOS在 iOS 中处理数千个套接字消息
【发布时间】:2018-03-30 11:59:44
【问题描述】:

我正在编写需要在 tableview 中显示套接字消息的代码,并且 tableview 滚动到底部并带有慢速动画。我处理了这个问题,但是如果从套接字继续加载消息(考虑每秒 20/30 条消息),那么 UI 就会冻结。我需要像 Facebook 一样在实时屏幕上显示消息,每次迭代一到两条消息。

这是我的代码

override func viewDidLoad() {
        super.viewDidLoad()
        Timer.scheduledTimer(timeInterval: 0.025, target: self, selector: #selector(self.scrollTableView(_:)), userInfo: nil, repeats: true)
        self.designLayout()

    }

@objc func scrollTableView(_ timer: Timer) {

        guard messagesData.count > 0 else {
            return
        }
        if tableView.contentSize.height > tableView.bounds.height {
            tableView.contentInset.top = 0
        }
        tableView.scrollToRow(at: IndexPath(row: messagesData.count - 1, section: 0), at: UITableViewScrollPosition.bottom, animated: true)

    }
self.socket.on(“key”) {data, ack in
                print("data type is \(type(of: data))")
                let arrayValue = data as Array<Any>
                DispatchQueue.global(qos: .background).async {
                    self.handleCountsAndMessaging(data: arrayValue)
                }
            }

func handleCountsAndMessaging(data: Array<Any>) {
  if let arrData = data[0] as? NSMutableDictionary {
     if(arrData.object(forKey: "text") != nil) {
                self.tableDataLoading(str: String(describing: arrData.object(forKey: "text")!))
            }
     }
}

func tableDataLoading() {
    print ("sttttttt \(str)")
    DispatchQueue.main.async {
        self.messagesData.add(str)
        self.tableView.reloadData()
    }
}

有时我从套接字收到 200 条消息,在处理之前的消息时又收到 200 条消息,CPU 消耗显示为 120 并且 UI 冻结。

提前致谢。

【问题讨论】:

    标签: ios swift uitableview socket.io


    【解决方案1】:

    嗯,有“活”和“活”:) 这是我们正在谈论的手机,因此每 0.025 秒更新一次屏幕是没有用的……您可以轻松减慢获取时间,但让我们一次解决一个问题:

    1/ 不要使用 tableView.scrollToRow,而是使用 'insertRows(at indexPaths: [IndexPath], with animation: UITableViewRowAnimation)' 插入一个新行,这样如果你的用户正在阅读,他不会'如果您添加 200 个新项目,请不要打扰 https://developer.apple.com/documentation/uikit/uitableview/1614879-insertrows

    2/ 减慢你的 UI 更新速度,你正在过度使用你的主线程...如果你愿意,你可以每 25 毫秒获取一次,但我建议只有在你获得新内容时才使用节流机制来更新 UI,并且只有在上次 UI 更新不少于 5 秒前。

    【讨论】:

    • 感谢@Florian 的指导,但仍然存在来自套接字的负载的问题,我只维护单个数组,一旦消息到来,我将更新同一个数组。我如何在提到的时间内保存套接字数据,例如 5 秒
    • 什么样的问题?
    • 抱歉@Florian 迟到了,问题是如果我在 1 或 2 秒后设置更新表格,它不会显示平滑滚动(如 Facebook Live),甚至我说可以,然后当有 400 条来自套接字的消息时,我也面临 UI 冻结问题,我担心如果有 1000 人并发,那么我将如何处理?
    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 2013-12-26
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多