gpt4 book ai didi

ios - UIApplication 的 `beginIgnoringInteractionEvents` 不工作

转载 作者:行者123 更新时间:2023-11-30 11:31:22 24 4
gpt4 key购买 nike

首先,我对长问题表示歉意,我个人更喜欢简短而精确的问题。

背景

我正在 UITableView 中开发搜索功能。为了存储数据,我使用核心数据。为了显示结果,我使用 NSFetchedResultsController。在我的 View 模型中,我有一个单独的 NSFetchedResultsController 来表示搜索结果。

目前我正在使用以下方法

`textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String)` 

UITextFieldDelegate 监听我的 UITextField 中的更改,并据此启动搜索。

我的执行获取部分如下所示

//
// 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
}
}

我已停止用户交互,以便用户无法再输入键盘,直到此搜索结束。如果启动多个搜索,表格 View 将无限期地重新加载,并且应用程序在访问以下内容时崩溃

managedObject = allContactSearchFetchResultController?.object(at: indexPath)

来自UITableViewDataSource

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

为了一次运行一个搜索操作,我开始忽略用户交互。搜索结束后,我结束忽略用户交互。

问题

它工作正常,直到我注意到按下并按住退格按钮,开始忽略用户交互不起作用。

enter image description here

所以问题出现了,我如何检查开始忽略用户交互是否不起作用。我设置了两个断点

一个在

UIApplication.shared.beginIgnoringInteractionEvents()

另一个在

UIApplication.shared.endIgnoringInteractionEvents()

当我按住退格按钮时,多个断点会命中 beginIgnoringInteractionEvents 而不会命中 endIgnoringInteractionEvents

可能的解决方案:

我已经找到了一种解决方法,使用managedObjectContext?.performAndWait而不是managedObjectContext?.perform。但这卡住了主线程。我必须在 UILabel 中显示当前状态为正在搜索...。如果我使用 ManagedObjectContext?.performAndWait ,它会省略阶段搜索,并在一段时间后直接显示搜索结果。相反,我更喜欢忽略用户交互并显示搜索操作的当前状态。

任何帮助将不胜感激。TIA

最佳答案

因为我想停下来

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

当我准备搜索结果时。结果取自 allContactSearchFetchResultController,但我将其分配给新的 NSFetchedResultsController,但 UITableView 正在调用基于 managedObject 的关于 allContactSearchFetchResultController 中的旧节计数和行计数如下

部分

allContactSearchFetchResultController?.sections?.count

allContactSearchFetchResultController?.sections[section].numberOfObject // There are more guard involved in this number of row fetching, for simplicity purpose i omitted those.

但是当我将 allContactSearchFetchResultController 分配给新的 NSFetchedResultsController 时, TableView 不断向 ​​cellForRowAtIndexPath 处请求旧的托管对象 因为 TableView 不知道我已将其分配给新的 NSFetchedResultsController。因此,在这种情况下,我的解决方案是创建一个新的本地 NSFetchedResultsController 准备它,在 ManagedObjectContext 的队列上对其执行提取。当结果准备好时,切换到 mainQueue 并分配它。我的执行获取部分现在看起来像这样。

//
// ALL of this operation Run on MainQueue
//
let allFetchRequest = prepareCommonFetchRequest()
allFetchRequest.predicate = NSPredicate.init(format: "name CONTAINS[cd] %@ || mobile_number CONTAINS[cd] %@", searchString, searchString)

let tempAllContactSearchFetchResultController = NSFetchedResultsController.init(fetchRequest: allFetchRequest,
managedObjectContext: managedObjectContext!,
sectionNameKeyPath: "section_key",
cacheName: nil)

managedObjectContext?.perform {
do {
try self.allContactSearchFetchResultController?.performFetch()
DispatchQueue.main.async {
self.allContactSearchFetchResultController = tempAllContactSearchFetchResultController
// calling the delegate which will reload the UITableView
}

} catch {
print("Error occur")
// TODO
// handle error here
}
}

关于ios - UIApplication 的 `beginIgnoringInteractionEvents` 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50212331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com