2017-03-28 12 views
0

MKLocalSearchCompleterを使用するネイティブモジュールを使用して、React Nativeアプリケーションでアドレス補完を実装しようとしています。簡単なデリゲートメソッドを持つシンプルなクラスですが、私のアプリから結果を得ることはできません。関連する単体テストを実行することさえできませんし、私はなぜそれがわかりません。iOS MapKit completerDidUpdateResultsが呼び出されていない

私は.queryFragmentプロパティを部分文字列に設定しています。これは、完了したとき、またはエラーがある場合に、代理人に通知する検索を自動的に開始するはずです。リクエストを行う前にデリゲートを適切に設定しましたが、デリゲートのcompleterDidUpdateResults(_ completer: MKLocalSearchCompleter)またはcompleter(_ completer: MKLocalSearchCompleter, didFailWithError error: Error)メソッドが呼び出されることはありません。

.isSearchingプロパティは、初期化後にfalseに設定され、.queryFragmentがtrueになると、内部的に動作しているように見えます。新しいプロジェクトを作成して同じクラスと単体テストでドラッグすると、テストは正常に実行され、問題なく結果が得られます。テストは約0.25秒で完了しますが、実際のアプリケーションプロジェクトでは、テストは30秒のタイムアウトになります私は応答を得る前に失敗します。

私はこの問題に見つけることができる唯一の他の質問は9月

から無応答と私と同じような状況を説明するのAppleデベロッパフォーラムの質問はここに私のコードやテストだた:

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

私がすることができました数日間プレイした後でこれを動作させることができますが、実際のAPIや実装ではなく、テスト自体に関連しているようです。テスト駆動型開発のためにはそうだと思います。問題は、私たちのテストターゲットが別々に追加され、メインスキームの「テスト」設定を使用するのではなく、独自のスキームを使って別のターゲットとして実行されていたことでした。なぜそれが違いを生み出したのかは完全にはわかりませんが、私のようにこの問題に悩まされているなら、それは私の最高のアドバイスです。

関連する問題