gpt4 book ai didi

快速任务继续误用 : leaked its continuation - for delegate?

转载 作者:行者123 更新时间:2023-12-04 11:56:35 25 4
gpt4 key购买 nike

我正在尝试扩展我的 classasync/await功能,但在运行时控制台中出现错误:

SWIFT TASK CONTINUATION MISUSE: query(_:) leaked its continuation!
以下是 class我正在尝试添加使用委托(delegate)的延续:
class LocalSearch: NSObject, MKLocalSearchCompleterDelegate {
private let completer: MKLocalSearchCompleter
private var completionContinuation: CheckedContinuation<[MKLocalSearchCompletion], Error>?

init() {
completer = MKLocalSearchCompleter()
super.init()
completer.delegate = self
}

func query(_ value: String) async throws -> [MKLocalSearchCompletion] {
try await withCheckedThrowingContinuation { continuation in
completionContinuation = continuation

guard !value.isEmpty else {
completionContinuation?.resume(returning: [])
completionContinuation = nil
return
}

completer.queryFragment = value
}
}

func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
completionContinuation?.resume(returning: completer.results)
completionContinuation = nil
}

func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
completionContinuation?.resume(throwing: error)
completionContinuation = nil
}
}
这是我如何使用它:
let localSearch = LocalSearch()

do {
let results = try await localSearch.query("toront")
print(results)
} catch {
print(error)
}
我做错了什么还是有更好的方法来实现这一目标?

最佳答案

当您拨打 query 时会发生这种情况第二次,而第一次继续没有完成。在这种情况下,第一个延续永远不会报告完成,这意味着 query 的第一个调用者永远不会恢复工作,这是不行的。
一个快速的解决方案是存储一个延续数组,在委托(delegate)方法中恢复所有延续,然后清除数组。
我还强烈建议将您的类转换为参与者,以避免数据竞争,无论您是存储一个延续(例如现在)还是使用数组。原因是 continuation 属性被多个线程使用,并且在某些时候您可能最终有两个线程同时访问/写入该属性。

关于快速任务继续误用 : leaked its continuation - for delegate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68145462/

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