До изменений в способе, которым мы возвращаем ячейки в методе cellForRow:
, я помню, что я смог бы проверить if cell == nil
, и в основном у меня есть две отдельные области для настройки, связанной с ячейками (свойства, которые применяются ко всем ячейкам противтолько для некоторых).Однако с dequeueReusableCell:
я не уверен, как справиться с этим и отложить его, пока я не смогу правильно заполнить все свои ячейки - но, по-видимому, за счет большого количества использования ЦП и памяти.Вот мой код в cellForRow:
в настоящее время:
if case (1...(days.count + 1), 2...(hours.count + 2)) = (indexPath.column, indexPath.row) {
let cell = spreadsheetView.dequeueReusableCell(withReuseIdentifier: String(describing: ScheduleCell.self), for: indexPath) as! ScheduleCell
let legs : NSArray = importedDict.object(forKey: "legs") as! NSArray
print(hours![indexPath.row - 2])
var profits : Array<Double> = []
if let singleLegDict2 = legs as? [[String:AnyObject]] {
print (singleLegDict2)
for singleLegDict in singleLegDict2 {
let dict = singleLegDict as NSDictionary
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let datee = dateFormatter.date(from: days![indexPath.column - 1] as! String)!
let datee2 = dateFormatter.date(from: dict.object(forKey: "expiry") as! String)!
let calendar = Calendar.current
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDay(for: datee)
let date2 = calendar.startOfDay(for: datee2)
let components = calendar.dateComponents([.day], from: date1, to: date2)
let doub = Double(components.day!)
let years = doub * 0.00273972602
// let under : NSNumber = dict.object(forKey: "underlying") as! NSNumber
let strike : NSNumber = dict.object(forKey: "strikePrice") as! NSNumber
let interest1 : NSNumber = dict.object(forKey: "interest") as! NSNumber
var interest2 = interest1 as! Double
interest2 = interest2/100
let userIV : NSNumber = NSNumber(value: Double(dict.object(forKey: "userIV") as! String)!)
var userIV2 = userIV as! Double
userIV2 = userIV2/100
var type = 0
if dict.object(forKey: "putCall") as! String == "CALL" {
type = 0
} else {
type = 1
}
let theo = getTheoreticalOptionPrice(forUnderlyingPrice: hours![indexPath.row - 2] as! NSNumber, withStrike: strike, withInterestRate: NSNumber(value: interest2), withVolatility: NSNumber(value: userIV2), withTimeToExpirationInYears: NSNumber(value: years), withType: NSNumber(value: type))
let userC : NSNumber = NSNumber(value: Double(dict.object(forKey: "userCost") as! String)!)
let quan : NSNumber = dict.object(forKey: "quantity") as! NSNumber
let diff = (theo - (userC as! Double)) * (quan as! Double)
print(theo, (userC as! Double))
profits.append(diff)
}
}
print(profits)
var sumedArr : Double = profits.reduce(0, {$0 + $1}) as Double
sumedArr = sumedArr * 100
if sumedArr < 0 {
cell.backgroundColor = UIColor(red: 0.8667, green: 0.1804, blue: 0.1804, alpha: 1.0)
} else {
cell.backgroundColor = UIColor(red: 0.3843, green: 0.7686, blue: 0.1608, alpha: 1.0)
}
cell.label.text = String(format: "%.0f", sumedArr)
return cell
}
Любые идеи о том, как ускорить это?Единственным способом будет предварительная загрузка данных и последующая ссылка на них только в cellForRow:
?Как бы я решил эту ситуацию, учитывая вычисления, которые я делаю для каждой ячейки?
Мне не нужно, чтобы ячейки перезагружали свои данные каждый раз, когда их прокручивают.Если все ячейки загружают свои данные один раз, когда загружается представление, и эти данные только что отображались - это было бы идеально.
Имея это в виду, я попытался добавить проверку, чтобы увидеть, заполнена ли метка ячейки или нет, и только если нет, выполнить все эти вычисления (предполагая, что это будет первая загрузка представления таблицы).Хотя это улучшило производительность прокрутки, ячейки отображались некорректно и были полностью не в порядке.Справка?
Обновление: Я перенес тяжелые вычисления в фоновый поток и теперь испытываю плавную прокрутку.Тем не менее, ячейки все еще мерцают, потому что они все еще восстанавливают свои данные каждый раз, когда их показывают.Какой самый простой способ кэшировать ячейки, чтобы они загружались один раз, когда отображается tableView
, а затем плавно прокручивались, потому что они ссылаются на уже загруженные данные?