[英]CLGeocoder reverseGeocodeLocation returning nil placemarks randomly
[英]test CLGeocoder geocodeAddressString method placemarks is always nil
代碼來自book,它總是在第一個XCTFail()中失敗,我在設備和模擬器上都嘗試過,它不應該是網絡問題,查看錯誤,它顯示Optional(Error Domain=kCLErrorDomain Code=2 "(null)")
func test_GeocoderWorksAsExpected() {
let expectation = expectationWithDescription("Wait for geocode")
CLGeocoder().geocodeAddressString("Infinite Loop 1, Cupertino") {
(placemarks, error) -> Void in
let placemark = placemarks?.first
let coordinate = placemark?.location?.coordinate
guard let latitude = coordinate?.latitude else {
XCTFail(); return
}
guard let longitude = coordinate?.longitude else {
XCTFail(); return
}
XCTAssertEqualWithAccuracy(latitude, 37.3316851, accuracy: 0.000001)
XCTAssertEqualWithAccuracy(longitude, -122.0300674, accuracy: 0.000001)
expectation.fulfill()
}
waitForExpectationsWithTimeout(3, handler: nil)
}
你說它不應該是網絡錯誤,但這恰恰是代碼為2的CLErrorDomain
錯誤( CLError.Network
)。 你可以出於各種原因得到它。 例如,當我嘗試監視與Charles的通信時,我得到了它,但還沒有告訴我的計算機信任Charles證書。 但是一旦我做了,那個錯誤就消失了。 您可能需要確認您沒有使用干擾TLS / HTTPS請求的代理服務器或其他網絡。
另外,我還建議:
defer
實現期望(無論你從那個閉包中取出什么路徑,它都會得到滿足); 和 所以,也許是這樣的:
func testGeocoder() {
let expectation = expectationWithDescription("Wait for geocode")
CLGeocoder().geocodeAddressString("Infinite Loop 1, Cupertino") { placemarks, error in
defer { expectation.fulfill() }
guard error == nil else {
XCTFail(error!.localizedDescription); return
}
guard let coordinate = placemarks?.first?.location?.coordinate else {
XCTFail("No coordinate"); return
}
XCTAssertEqualWithAccuracy(coordinate.latitude, 37.3316851, accuracy: 0.001, "Latitude doesn't match")
XCTAssertEqualWithAccuracy(coordinate.longitude, -122.0300674, accuracy: 0.001, "Longitude doesn't match")
}
waitForExpectationsWithTimeout(3, handler: nil)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.