swift 表视图冻结

q43xntqr  于 2022-12-21  发布在  Swift
关注(0)|答案(1)|浏览(143)

我有一个项目数组和TableView来显示它们。项目由4个属性组成。并且有一个随机生成项目的方法。最初,数组为空,但在viewDidLoad中,我有一个方法,该方法将100个项目追加到数组中,延迟约1秒。数组将追加到其计数约1_000_000个项目。当我启动应用程序时,它冻结。
生成物料方式:

func subscribeToDeals(callback: @escaping ([Deal]) -> Void) {
    queue.async {
      var deals: [Deal] = []
      let dealsCount = Int64.random(in: 1_000_000..<1_001_000)
      let dealsCountInPacket = 100
      var j = 0
      for i in 0...dealsCount {
        let currentTimeStamp = Date().timeIntervalSince1970
        let timeStampRandomizer = Double.random(in: 50_000...50_000_000)
        let deal = Deal(
          id: i,
          dateModifier: Date(timeIntervalSince1970: Double.random(in: currentTimeStamp - timeStampRandomizer...currentTimeStamp)),
          instrumentName: self.instrumentNames.shuffled().first!,
          price: Double.random(in: 60...70),
          amount: Double.random(in: 1_000_000...50_000_000),
          side: Deal.Side.allCases.randomElement()!
        )
        deals.append(deal)
        
        j += 1
        
        if j == dealsCountInPacket || i == dealsCount {
          j = 0
          let delay = Double.random(in: 0...3)
          let newDeals = deals
          DispatchQueue.main.asyncAfter(deadline: .now()+delay) {
            callback(newDeals)
          }
          deals = []
        }
      }
    }
  }

这是我的tableView方法:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return model.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: DealCell.reuseIidentifier, for: indexPath) as! DealCell
        guard model.count != 0 else {
            cell.instrumentNameLabel.text = "no data"
            cell.priceLabel.text = "no data"
            cell.amountLabel.text = "no data"
            cell.sideLabel.text = "no data"
            return cell
        }
        cell.instrumentNameLabel.text = "\(model[indexPath.row].instrumentName)"
        cell.priceLabel.text = "\(model[indexPath.row].price)"
        cell.amountLabel.text = "\(model[indexPath.row].amount)"
        cell.sideLabel.text = "\(model[indexPath.row].side)"
        return cell
    }

用于追加数组的函数:

server.subscribeToDeals { deals in
            self.model.append(contentsOf: deals)
            self.tableView.reloadData()
        }

如何解决这个问题?可能是使一些计数器“numberOfRowsInSection”等于100,然后当滚动到第100项时将其增加到200等。或者有更简洁的解决方案吗?
尝试使用ReusableCell,但没有任何React。

oxiaedzo

oxiaedzo1#

下面的代码应该可以通过使用DispatchQueue解除阻塞主线程来解决您的问题

server.subscribeToDeals { deals in
       self.model.append(contentsOf: deals)
       DispatchQueue.main.async {
          self.tableView.reloadData()
       } 
    }

相关问题