2017-03-28 3 views
0

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) 
    } 

} 

답변

0

내가 할 수 있었다 :이 문제에서 찾을 수

유일한 다른 문제는 여기에 내 코드와 테스트는 9 월에

에서 응답이없는 경우 내 같은 상황을 설명하는 애플 개발자 포럼 질문이었다 며칠 만에 돌아 다닌 후에이 기능을 사용할 수는 있지만 실제 API 나 구현보다는 테스트 자체와 관련이있는 것으로 보입니다. Test-Driven-Development에 많은 도움이 될 것 같습니다. 문제는 우리의 테스트 타겟이 별도로 추가되었고 주요 계획에서 '테스트'구성을 사용하지 않고 자체 계획과 별도의 목표로 실행되고 있다는 것이 었습니다. 왜 그것이 차이를 만들 었는지 완전히 확신 할 수는 없지만, 내가 그랬듯이 당신이이 문제에 얽매여 있다면 그것은 최고의 충고입니다.

관련 문제