【发布时间】:2018-05-07 10:44:06
【问题描述】:
首先我为长问题道歉,我个人更喜欢短而精确的问题。
背景
我正在UITableView 中开发搜索功能。存储数据我使用core data。为了显示我使用NSFetchedResultsController 的结果。在我的视图模型中,我有一个单独的 NSFetchedResultsController 来表示搜索结果。
目前我正在使用以下方法
`textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String)`
从UITextFieldDelegate 收听我的UITextField 的变化,并以此为基础开始搜索。
我的perform fetch 部分如下所示
//
// ALL of this operation Run on MainQueue
//
// Preparing NSFetchRequest and setting
// it's predicate Goes here
//
UIApplication.shared.beginIgnoringInteractionEvents()
managedObjectContext?.perform {
do {
try self.allContactSearchFetchResultController?.performFetch()
DispatchQueue.main.async {
UIApplication.shared.endIgnoringInteractionEvents()
// calling the delegate which will reload the UITableView
}
} catch {
print("Error occur")
// TODO
// handle error here
}
}
我已停止用户交互,因此用户在此搜索结束之前无法再输入键盘。如果启动了多个搜索,tableview 会无限期地重新加载,并且应用程序在访问以下内容时崩溃
managedObject = allContactSearchFetchResultController?.object(at: indexPath)
来自UITableViewDataSource
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
为了一次运行一个搜索操作,我开始忽略用户交互。搜索结束后,我将忽略用户交互。
问题
它工作正常,直到我注意到按下并按住退格按钮,开始忽略用户交互不起作用。
所以问题出现了,我如何检查开始忽略用户交互是否不起作用。我放了两个断点
一个在
UIApplication.shared.beginIgnoringInteractionEvents()
另一个在
UIApplication.shared.endIgnoringInteractionEvents()
当我按住退格按钮时,多个断点命中beginIgnoringInteractionEvents,而不命中endIgnoringInteractionEvents。
可能的解决方案:
我已经找到了使用managedObjectContext?.performAndWait 而不是managedObjectContext?.perform 的方法。但这卡住了主线程。我必须在UILabel 中显示当前状态为searching...。如果我使用managedObjectContext?.performAndWait,它会省略阶段搜索并在一段时间后直接显示搜索结果。而不是这个,我更喜欢忽略用户交互并显示搜索操作的当前状态。
任何帮助将不胜感激。 T.I.A
【问题讨论】:
标签: ios swift core-data nsoperationqueue uiapplication