MKLocalSearchCompleter
을 사용하는 기본 모듈을 사용하여 React Native 응용 프로그램에서 주소 완성을 구현하려고합니다. 그것은 간단한 대리자 메서드를 사용하는 간단한 클래스이지만, 앱에서 결과를 얻지 못하는 것 같습니다. 심지어 관련 Unit Tests를 실행해도 작동하지 않으며 이유가 확실하지 않습니다.iOS MapKit completerDidUpdateResults가 호출되지 않았습니다.
무슨 일이 일어 났는지는 .queryFragment
속성을 부분 문자열로 설정하면 내 대리인에게 완료되었거나 오류가 발생했을 때이를 알리는 검색이 자동으로 시작됩니다. 요청하기 전에 대리자를 적절하게 설정했지만 대리자 completerDidUpdateResults(_ completer: MKLocalSearchCompleter)
또는 completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error)
메서드는 호출되지 않습니다.
초기화 후 .isSearching
속성이 false로 설정되고 .queryFragment
이 true로 설정되면 내부적으로 작동하는 것처럼 보입니다. 새 프로젝트를 생성하고 똑같은 클래스와 단위 테스트로 드래그하면 테스트가 잘 실행되고 결과가 아무런 문제없이 완료되고 ~ 0.25 초 안에 테스트가 완료되지만 실제 애플리케이션 프로젝트에서는 테스트가 30 초의 시간 초과에 도달합니다 응답을 받기 전에 실패합니다.
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)
}
}