微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UITableView 冻结直到循环完成

如何解决UITableView 冻结直到循环完成

我正在使用此代码Database 表中搜索文本:

func runSearch(_ pattern: String) {
    for book in selectedBooks {
        let path = Bundle.main.path(forResource: "library",ofType: "sqlite")!
        let sqlState = "select * from \(book.name)"
        
        guard
            let db = FMDatabase(path: path),db.open(),let result = db.executeQuery(sqlState,withArgumentsIn: [])
        else { return }
        
        while result.next() {
            RunLoop.current.run(mode: .default,before: .distantPast)
            
            let pageID = result.long(forColumn: "Id")
            let pageText = result.string(forColumn: "page_text") ?? ""
            
            if isMatches(regex: pattern,in: pageText) {
                dataSource.append(dbItem(id: pageID,text: pageText))
                resultsLabel.text = "Results count: " + dataSource.count.description

                let indexPath = IndexPath(row: dataSource.count - 1,section: 0)
                tableView.insertRows(at: [indexPath],with: .automatic)
            }
        }
    }
    
}


func isMatches(regex: String,in str: String) -> Bool {
    do {
        let regex = try NSRegularExpression(pattern: regex)
        let matches = regex.matches(in: str,range: NSRange(location: 0,length: str.count))
        return matches.count != 0
        
    } catch {
        print("Something went wrong! Error: \(error.localizedDescription)")
    }
    return false
}

我有 40 多本书要搜索搜索完成,但“UITableView”冻结,直到搜索完成。我希望允许用户滚动浏览此表并选择他希望在搜索显示的结果。

有人可以帮我吗?

解决方法

您可以创建一个异步函数,您可以在其中完成所有工作,并在函数结束后调用 tableView.reloadData。此外,您不能在每个循环后插入行,但是当整个循环结束并且您的数据源中有正确的数据时,然后将数据重新加载到您的表视图以使用新数据刷新它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。