未调用iOS MapKit completerDidUpdateResults
我试图通过使用使用未调用iOS MapKit completerDidUpdateResults,ios,swift,cocoa-touch,react-native,mapkit,Ios,Swift,Cocoa Touch,React Native,Mapkit,我试图通过使用使用MKLocalSearchCompleter的本机模块在React本机应用程序中实现地址完成。它是一个简单的类,具有简单的委托方法,但我似乎无法从我的应用程序中获得结果。即使运行相关的单元测试也不起作用,我不知道为什么 我将.queryFragment属性设置为我的部分字符串,这将自动启动搜索,在搜索完成或出现错误时通知我的代理。我在发出请求之前适当地设置了委托,但是我的委托completerDidUpdateResults(\uCompleter:MKLocalSearchC
MKLocalSearchCompleter
的本机模块在React本机应用程序中实现地址完成。它是一个简单的类,具有简单的委托方法,但我似乎无法从我的应用程序中获得结果。即使运行相关的单元测试也不起作用,我不知道为什么
我将.queryFragment
属性设置为我的部分字符串,这将自动启动搜索,在搜索完成或出现错误时通知我的代理。我在发出请求之前适当地设置了委托,但是我的委托completerDidUpdateResults(\uCompleter:MKLocalSearchCompleter)
或completer(\uCompleter:MKLocalSearchCompleter,DidFailWitherError: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)
}
}
在玩了几天之后,我就可以让它正常工作了,但它似乎与测试本身有关,而不是与实际的API或实现有关。我想测试驱动开发就到此为止了。问题在于,我们的测试目标是单独添加的,并且作为一个单独的目标运行,并具有自己的方案,而不是使用主方案中的“测试”配置。不完全清楚为什么会有不同,但如果你像我一样被困在这个问题上,这是我最好的建议