测试 CLGeocoder geocodeAddressString 方法地标始终为零
Posted
技术标签:
【中文标题】测试 CLGeocoder geocodeAddressString 方法地标始终为零【英文标题】:test CLGeocoder geocodeAddressString method placemarks is always nil 【发布时间】:2016-08-12 05:39:24 【问题描述】:代码来自书,第一次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)
【问题讨论】:
【参考方案1】:您说这不应该是网络错误,但这正是代码为 2 的 CLErrorDomain
错误 (CLError.Network
)。您可以出于多种原因得到它。例如,当我尝试监视与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)
【讨论】:
我会说这是一个超出我能力范围的网络问题,我不小心将代码中填写的地址替换为我的家庭地址并且它有效。感谢您的回答,我真的从您提供的代码中学到了一些东西:)以上是关于测试 CLGeocoder geocodeAddressString 方法地标始终为零的主要内容,如果未能解决你的问题,请参考以下文章
同步请求 CLGeocoder.reverseGeocodeLocation