Arrays DispatchWorkItem不立即取消任务
我的搜索问题很严重 有一个包含30000个对象的结构数组和一个文本视图,当输入字母时,我删除空格并在searchText中设置文本,searchText有WillSet和DidSet,在WillSet中我用旧文本取消所有搜索任务,并用DidSet中的新文本开始搜索。在Arrays DispatchWorkItem不立即取消任务,arrays,swift,for-loop,dispatch,dispatchworkitem,Arrays,Swift,For Loop,Dispatch,Dispatchworkitem,我的搜索问题很严重 有一个包含30000个对象的结构数组和一个文本视图,当输入字母时,我删除空格并在searchText中设置文本,searchText有WillSet和DidSet,在WillSet中我用旧文本取消所有搜索任务,并用DidSet中的新文本开始搜索。在search()函数中,我遍历了数组并向anyTranslate()函数中的DispatchWorkItem添加了逻辑,当我键入大量字符时,searchText给出了错误-[CFString length]:发送到解除分配实例的消息
search()
函数中,我遍历了数组并向anyTranslate()
函数中的DispatchWorkItem添加了逻辑,当我键入大量字符时,searchText给出了错误-[CFString length]:发送到解除分配实例的消息。我创建了一个变量类型test
,它在anyTranslate()
中不应为true,但有时它会打印true,只有当test等于true时,错误才会出现,据我所知DispatchWorkItem
不会一次取消所有任务
我怎样才能解决这个问题
static var splitArr = (first:[Words](),second:[Words](),third:[Words](), four:[Words](), five:[Words]()) // fragmented array for faster searching
var work:[DispatchWorkItem?] = [nil,nil,nil,nil,nil]
var test = false
private var searchText = "" {
didSet{
test = false
if searchText.count >= 2 {
self.search(nil)
}
}
willSet{
for (i,ind) in self.work.enumerated() {
ind?.cancel()
self.test = true
}
}
}
func search(_ completion:(() -> ())?){
update = true
words.removeAll()
DispatchQueue.main.async {
self.tableView.isUserInteractionEnabled = false
self.indicator.isHidden = false
self.indicator.startAnimating()
}
let arr = [ViewController.splitArr.first, ViewController.splitArr.second, ViewController.splitArr.third, ViewController.splitArr.four, ViewController.splitArr.five]
for (i,value) in arr.enumerated() {
work[i] = DispatchWorkItem { [weak self] in
let lang = Language.first()
for (index,words) in value.enumerated() {
guard self?.work[i]?.isCancelled == false else { break }
self?.anyTranslate(with: words, and: lang)
if index == value.count - 1 {
DispatchQueue.main.async {
if self?.words.count == 0 {
self?.noFound()
}
self?.tableView.reloadData()
self?.tableView.isUserInteractionEnabled = true
self?.indicator.isHidden = false
self?.indicator.stopAnimating()
completion?()
}
}
}
}
guard let current = work[i] else { return }
DispatchQueue.global(qos: .userInteractive).async(execute: current)
}
}
func anyTranslate(with words: Words, and lang:String){
let array = Language.getLang(lang: lang, word: words)
for value in array[0] ?? [""] {
if test == true {
print(true)
}
// - [CFString length]: message sent to deallocated instance
if value.hasPrefix(searchText) {
addWord(with: words)
return
}
}
}
@pckill我看到了这个答案,但它对我没有帮助,我还有另一个问题,你可能需要检查for
循环中anyTranslate
@pckill我做了些什么,anyTranslate因为取消工作项而被解除。如果是,则在搜索(nil)执行期间设置了searchtext。在执行过程中,您可以尝试使用强引用或阻止调用搜索(nil)。