iOS MapKit CompleterDidUpdateResults 未调用

标签 ios swift cocoa-touch react-native mapkit

我正在尝试通过使用使用 MKLocalSearchCompleter 的 native 模块在 React Native 应用程序中实现地址补全。这是一个足够简单的类,具有简单的委托(delegate)方法,但我似乎无法从我的应用程序中获得结果。即使运行相关的单元测试也不起作用,我不确定为什么。

发生的情况是,我将 .queryFragment 属性设置为我的部分字符串,这应该会自动启动搜索,并在搜索完成或出现错误时通知我的委托(delegate)。我在发出请求之前适本地设置了委托(delegate),但我的委托(delegate) completerDidUpdateResults(_completer: MKLocalSearchCompleter)completer(_completer: MKLocalSearchCompleter, didFailWithError error: Error) 方法永远不会得到已调用。

.isSearching 属性在初始化后设置为 false,当我设置 .queryFragment 时,它变为 true,因此它似乎在内部工作。如果我创建一个新项目并拖入完全相同的类和单元测试,则测试运行良好,并且没有任何问题地得到结果,并且测试在 ~0.25 秒内完成,但在我的实际应用程序项目中,测试达到 30 秒超时在我得到回复之前就失败了。

关于这个问题,我能找到的唯一其他问题是苹果开发者论坛的一个问题,解释了我的相同情况,但 9 月份没有回复

这是我的代码和测试:

class AddressUtils: NSObject, MKLocalSearchCompleterDelegate {

    let searchCompleter = MKLocalSearchCompleter()
    var results: [MKLocalSearchCompletion]?
    var onSuggestionsReceived: (([String]) -> Void)?

    public override init() {
        super.init()
        searchCompleter.delegate = self
    }

    public func getAddressSuggestions(address: String!, completion: @escaping ([String]) -> Void) {
        self.onSuggestionsReceived = completion
        searchCompleter.queryFragment = address
        if searchCompleter.isSearching {
            print("Searching") // Prints
        }
    }

    func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        self.results = completer.results
        let results = completer.results.flatMap { (result) -> String? in
            return result.title + " " + result.subtitle
        }
        onSuggestionsReceived?(results)
    }

    func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
        onSuggestionsReceived?([])
    }

}

class UtilityTests: XCTestCase {

    func testAddressAutocomplete() {
        let expectation = self.expectation(description: "Perform search")
        let query = "11 Farns"
        let utils = AddressUtils()
        utils.getAddressSuggestions(address: query) { (results) in
            expectation.fulfill()
        }
        wait(for: [expectation], timeout: 30)
    }

}

最佳答案

不确定您是否解决了这个问题,但我也遇到了同样的问题。通过确保仅设置 queryFragment 而不是主线程来设法修复。

private let completer: MKLocalSearchCompleter

DispatchQueue.main.async { [weak self] in
    self?.completer.queryFragment = newValue
}

关于iOS MapKit CompleterDidUpdateResults 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43079766/

相关文章:

ios - 从 UITableviewCell 中的按钮打开的下拉菜单 UIView 在单元格边界外不可单击

ios - 表格 View 选择和平移手势

ios - Swift XCUI 字符串断言失败

ios - Swift:如何从 cocoapods 实现协议(protocol)

ios - 带预览的分页 UIImages

iphone - 停止在应用程序进入前台后调用setKeepAliveTimeout处理程序吗?

ios - 用于在 iPhone 设备上显示持久存储内容的 GUI

swift - 如何使用 swift 引用文本字段?

ios - UITableView setEditing 不会为标签约束更改设置动画

ios - 横向展开的uiscrollview还是uitableview?