UITextView 上的 NSRegularExpressions 性能
NSRegularExpressions performance on UITextView
我目前正在使用 NSRegularExpressions
(regex
),我正在构建一个 markdown regex
。
我认为我更改与 regex
匹配的文本的方法不是最好的方法,原因如下。
我创建了以下示例:
UITextViewDelegate
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
regularExpression()
return true
}
func regularExpression() {
// Some other regular expressions....
let boldPattern = "\*{2}([\w\d ]+)\*{2}"
do {
let regex = try NSRegularExpression(pattern: boldPattern)
let results = regex.matches(in: str, range: NSRange(str.startIndex..., in: str))
_ = results.map {
self.applyAttributes(toRange: [=10=].range, withType: .bold)
}
} catch let err{
print("error:", err.localizedDescription)
}
}
正如您在上面看到的,为了让我在用户输入时立即更新文本,我目前正在浏览文本,针对每个插入的字符,并分析是否有任何匹配模式(在这种情况下加粗为 ** 一些文本 **);
通过这样做,当我输入 CPU 时,使用率从 3% 增加到 25%,因此我认为这不是最好的方法。
在用户键入时即时应用 NSRegularExpressions
的最佳方法是什么? - 我现在用的是最好的吗?
谢谢
一个非常简单的解决方案是在调用 regularExpression
方法之前检查插入的文本是否包含 *
(星号):
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text.contains("*"){
regularExpression()
}
return true
}
我目前正在使用 NSRegularExpressions
(regex
),我正在构建一个 markdown regex
。
我认为我更改与 regex
匹配的文本的方法不是最好的方法,原因如下。
我创建了以下示例:
UITextViewDelegate
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
regularExpression()
return true
}
func regularExpression() {
// Some other regular expressions....
let boldPattern = "\*{2}([\w\d ]+)\*{2}"
do {
let regex = try NSRegularExpression(pattern: boldPattern)
let results = regex.matches(in: str, range: NSRange(str.startIndex..., in: str))
_ = results.map {
self.applyAttributes(toRange: [=10=].range, withType: .bold)
}
} catch let err{
print("error:", err.localizedDescription)
}
}
正如您在上面看到的,为了让我在用户输入时立即更新文本,我目前正在浏览文本,针对每个插入的字符,并分析是否有任何匹配模式(在这种情况下加粗为 ** 一些文本 **);
通过这样做,当我输入 CPU 时,使用率从 3% 增加到 25%,因此我认为这不是最好的方法。
在用户键入时即时应用 NSRegularExpressions
的最佳方法是什么? - 我现在用的是最好的吗?
谢谢
一个非常简单的解决方案是在调用 regularExpression
方法之前检查插入的文本是否包含 *
(星号):
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text.contains("*"){
regularExpression()
}
return true
}