我有一个项目数组和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。
1条答案
按热度按时间oxiaedzo1#
下面的代码应该可以通过使用DispatchQueue解除阻塞主线程来解决您的问题