未调用 iOS MapKit completerDidUpdateResults

Posted

技术标签:

【中文标题】未调用 iOS MapKit completerDidUpdateResults【英文标题】:iOS MapKit completerDidUpdateResults not called 【发布时间】:2017-03-28 20:55:00 【问题描述】:

我正在尝试通过使用使用 MKLocalSearchCompleter 的本机模块在 React Native 应用程序中实现地址完成。这是一个足够简单的类,具有直接的委托方法,但我似乎无法从我的应用程序中获得结果。即使运行相关的单元测试也不起作用,我不知道为什么。

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

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

我能找到的关于这个问题的唯一其他问题是一个 Apple Developer Forum 问题,它解释了我的相同情况,但从 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)
    


【问题讨论】:

【参考方案1】:

在玩了几天之后,我能够让它工作,但它似乎与测试本身有关,而不是与实际的 API 或实现有关。我想测试驱动的开发就这么多了。问题是我们的测试目标是单独添加的,并且是作为具有自己方案的单独目标运行的,而不是使用主方案中的“测试”配置。不完全确定为什么会有所作为,但如果您像我一样被困在这个问题上,这是我最好的建议。

【讨论】:

以上是关于未调用 iOS MapKit completerDidUpdateResults的主要内容,如果未能解决你的问题,请参考以下文章

mapView 中的用户位置未显示在多个模拟器设备(MapKit)上

iOS Mapkit - 用户位置显示为 0, 0

MapKit - 找到路线但未显示

iOS核心笔记—MapKit框架-基础

IOS-MapKit

MapKit 地图 - 注释未显示在模拟器上