Я работаю над приложением, которое содержит textView и несколько кнопок, оно выполняет некоторые вычисления на основе положения курсора. Он содержит циклы for и массивы, а также расширение String для получения символа после/перед курсором и добавления или удаления из него. Он работает гладко с 500 символами или меньше, но более того, он начинает замедляться при добавлении или удалении из textView, а с более чем 1000 символов работать с ним становится невыносимо. Я тестировал его с iPhone 6s Plus и iPad Pro 2nd 12inch, и в симуляторе Xcode он работает точно так же со всеми этими устройствами, поэтому я не думаю, что это аппаратное ограничение.
Вот несколько примеров кода:
func checkLetter () {
let nextOne = textView.text.unicodeScalars[getCursorPosition()]
let nextTwo = textView.text.unicodeScalars[getCursorPosition()+1]
let nextThree = textView.text.unicodeScalars[getCursorPosition()+2]
let testLetter = ["ّ","ْ","ٌ","ُ","ٍ","ِ","ً","َ"]
for b in 0...7 {
if nextThree == testLetter[b] && nextTwo == "ّ" {
print ("Next Three!")
nextChar()
nextChar()
delLetter()
delLetter()
preChar()
}else if nextThree == testLetter[b] && nextTwo == testLetter[b] {
print ("Next Three!")
nextChar()
nextChar()
nextChar()
delLetter()
delLetter()
preChar()
}else if nextTwo == testLetter[b] {
print ("Next Two!")
nextChar()
nextChar()
delLetter()
preChar()
}else if nextOne == testLetter[b] {
print ("Next One!")
nextChar()
delLetter()
preChar()
}
}
}
.
func preChar () {
// only if there is a currently selected range
if let selectedRange = textView.selectedTextRange {
// and only if the new position is valid
if let newPosition = textView.position(from: selectedRange.start, offset: -1) {
// set the new position
textView.selectedTextRange = textView.textRange(from: newPosition, to: newPosition)
}
}
}
.
func skipSpace () {
for _ in spaceCount...textView.text.count {
if checkSpace() == false {
nextChar()
}
}
}
Расширение, которое я использую
extension String.UnicodeScalarView {
var length: Int {
return count
}
subscript (i: Int) -> String {
return self[i ..< i + 1]
}
func substring(fromIndex: Int) -> String {
return self[Swift.min(fromIndex, length) ..< length]
}
func substring(toIndex: Int) -> String {
return self[0 ..< Swift.max(0, toIndex)]
}
subscript (r: Range<Int>) -> String {
let range = Range(uncheckedBounds: (lower: Swift.max(0, Swift.min(length, r.lowerBound)),
upper: Swift.min(length, Swift.max(0, r.upperBound))))
let start = index(startIndex, offsetBy: range.lowerBound)
let end = index(start, offsetBy: range.upperBound - range.lowerBound)
return String(self[start ..< end])
}
}
Затем эти и другие функции вызываются при нажатии кнопки.
Пожалуйста, помогите, если вы знаете, как я могу улучшить скорость.
Спасибо, я удалил предыдущее сообщение, потому что знал, что мне понадобится некоторое время, чтобы получить примеры кода, и бесполезно хранить пост так долго без каких-либо примеров, поэтому я решил вместо этого удалить его. Спасибо за ваш комментарий.
Начните с использования инструментов и посмотрите, какие строки кода действительно вызывают проблему.





Я исправил это, и теперь это намного быстрее. Это был метод skipSpace().
func skipSpace () {
for _ in spaceCount...textView.text.count {
if checkSpace() == false {
nextChar()
}
}
Когда я набираю много текста, этот диапазон цикла становится огромным (spaceCount...textView.text.count), потому что он получает количество символов в textView, поэтому его нужно было просто изменить на фиксированное число, например: (spaceCount.. .50), и все!
Спасибо
В следующий раз, пожалуйста, отредактируйте свой существующий пост, а не репост.