TextView обрабатывает много символов в Swift - PullRequest
0 голосов
/ 19 января 2019

Я работаю над приложением, которое содержит textView и несколько кнопок, оно выполняет некоторые вычисления на основе позиции курсора. Он содержит циклы и массивы и расширение String для получения символа после / до курсора и добавления или удаления из него. Он работает плавно с 500 символами или менее, но более того он начинает медленно добавляться или удаляться из textView, а с более чем 1000 символов становится невыносимо работать. Я протестировал его на iPhone 6s Plus и iPad Pro 2nd 12-дюймовый, и в симуляторе 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])
  }  
}

Затем эти и другие функции вызываются при нажатии кнопки.

Пожалуйста, помогите, если вы знаете, как я могу улучшить скорость.

1 Ответ

0 голосов
/ 25 января 2019

Я исправил это, и теперь оно намного быстрее.Это был метод skipSpace ().

func skipSpace () {
for _ in  spaceCount...textView.text.count {
    if checkSpace() == false {
        nextChar()
    }
}

Когда я набираю много текста, этот диапазон цикла становится огромным (spaceCount ... textView.text.count), потому что он получает количество символов в textView, поэтому его просто нужно было изменить нафиксированное число, например: (spaceCount ... 50), и все!

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...