UI 挂起,直到所有提取完成



我有这段代码来搜索不同的表,我的问题是在执行 las 获取请求之前我无法与 UI 交互。如果我搜索特定值并且结果在"Table2"中,则 tableView 会更新正常,但在完成搜索最后一个表之前无法与之交互。func loadData() 只需要几毫秒即可执行和退出,并且提取在不同的线程中执行。我不知道这段代码有什么问题,有什么帮助或建议吗?所有表中的记录总数约为 500 万条,搜索所有记录需要一些时间,这就是为什么我不想让用户等待某些结果可用,然后再完成搜索整个数据库。

func loadData () {
    let tablas = ["Table1", "Table2", "Table3", "Table4", "Table5", "Table6", "Table7", "Table8", "Table9", "Table10", "Table11"]
    let managedContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
    managedContext.parentContext = self.moc
    for tbl in tablas {
        managedContext.performBlock {
            let fetchRequest = NSFetchRequest(entityName: tbl)
            let predicate = NSPredicate(format: "name CONTAINS %@", self.filter)
            fetchRequest.predicate = predicate
            fetchRequest.resultType = NSFetchRequestResultType.ManagedObjectIDResultType
            fetchRequest.fetchLimit =  50
            fetchRequest.fetchBatchSize = 10
            do {
                let results = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObjectID]
                if results.count != 0 {
                    self.resultArray.appendContentsOf(results)
                    dispatch_async(dispatch_get_main_queue()) {
                        self.tableView.reloadData()
                    }
                }
            } catch let error as NSError {
                dispatch_async(dispatch_get_main_queue()) {
                    let errorAlert = UIAlertController(title: "Error!!!", message: error.localizedDescription, preferredStyle: .Alert)
                    errorAlert.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil))
                    self.presentViewController(errorAlert, animated: true, completion: nil)
                }
            }
        }
    }
}

以下是一些链接,可帮助您规划代码

UITableView 从 JSON 加载数据

加载核心数据后异步刷新 uitableview

25 个 iOS 应用程序性能提示技巧(雷·温德利希)

UI 在主线程中处理其大部分进程。如果你有一个主要进程,不要在主线程上同步运行它。您可以在主线程上异步运行它。

要在主线程上异步运行的代码:

dispatch_async(dispatch_get_main_queue(), {
    // RUN CODE OVER HERE
})

相关内容

  • 没有找到相关文章

最新更新