在我的一个应用程序中,我需要地理编码地址字符串。起初我考虑使用CLGeocoder
。然而,在我尝试之后,我偶然发现了一个我在这个问题中描述的问题。
解决方案是使用谷歌的地理编码api。我现在已经切换到它们,并设法通过以下功能让它们工作:
func startConnection(){
self.data = NSMutableData()
let urlString = "https://maps.googleapis.com/maps/api/geocode/json?address=(searchBar.text!)&key=MYKEY"
let linkUrl:NSURL = NSURL(string:urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)!
let request: NSURLRequest = NSURLRequest(URL: linkUrl)
let connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
connection.start()
}
func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
self.data.appendData(data)
}
func connectionDidFinishLoading(connection: NSURLConnection!) {
do {
if let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? [String: AnyObject] {
print(json)
}
}
catch {
print("error1")
}
}
这很好地解决了我与CLGeocoder
的问题。但是,除了提取地点的坐标之外,我还需要使用Google的Timezone api来提取每个地点的时区。
用NSURLConnection
或NSURLSession
这样做对我来说有点困难,因为我需要跟踪哪个会话/连接返回。所以,我想有一些解决方案,使用完成处理程序。
我尝试过使用Alamofire框架(使用Swift 2.0的正确分支)。然而,在这种情况下,request()
函数似乎是错误的。我试过了:
let parameters = ["address":searchBar.text!,"key":"MYKEY"]
Alamofire.request(.GET, "https://maps.googleapis.com/maps/api/geocode/json", parameters: parameters).responseJSON(options:.AllowFragments) { _, _, JSON in
print(JSON)
}
而我得到的却是"成功"。我希望我做错了什么,它可以修复,因为我真的希望能够使用闭包而不是委托调用。
我的问题是:
- 是否可以使用Alamofire与谷歌地理编码api ? 如果是这样,你能告诉我我做错了什么吗?
- 如果不可能,你能建议我如何设计一个系统与
NSURSession
s或NSURLConnection
s,这将允许我使用完成处理程序为每个调用而不是委托?
注:我知道我可以使用同步请求,但我真的希望避免使用该选项
<标题> 更新建议添加.MutableContainers
作为选项应该使responseJSON
工作。我尝试了下面的代码:
let apiKey = "MYKEY"
var parameters = ["key":apiKey,"components":"locality:(searchBar.text!)"]
Alamofire.request(.GET, "https://maps.googleapis.com/maps/api/geocode/json", parameters: parameters).responseJSON(options:.MutableContainers) { one, two, JSON in
print(JSON)
}
我得到的结果是&;success &;
标题>好了,我终于弄明白了(在@cnoon的帮助下)。返回的值类型为Result
。我找不到它的文档,但是源代码可以在这里找到。
为了检索JSON下面的实现可以使用:
Alamofire.request(.GET, "https://mapss.googleapis.com/maps/api/geocode/json", parameters: parameters).responseJSON(options:.MutableContainers) { _, _, JSON in
switch JSON {
case .Failure(_, let error):
self.error = error
break
case .Success(let value):
print(value)
break
}
}
打印的value
是Geocoding api响应的正确表示。