- Использование класса упоминается в файле верхнего уровня класса как прокомментированный код.Не получать обратные вызовы методов делегатов в классе NSObject ios swift
- Этот класс используется, чтобы найти его местоположение, и после этого из страны местоположения выбирается API Google.
- Не удалось получить обратные вызовы местоположения в методах делегата locationManager, например, «didUpdateLocations», даже если я написал «locationManager.delegate = self».
- Пожалуйста, проверьте код ниже. Мне нужна помощь, чтобы выяснить, что не так. Если такой тип конфигурации невозможен, пожалуйста, предложите мне альтернативный блок кода для замены ниже кода.
import UIKit
import CoreLocation
class GetCountryCode: NSObject, CLLocationManagerDelegate {
// Usage of class
/*let getCountryeCode = GetCountryCode()
getCountryeCode.createLocationRequest({ (response) -> Void in
print("Response:\(response)")
})*/
typealias CompletionHandler = (countryCode:String) -> Void
var completionHandler: CompletionHandler?
private var locationManager: CLLocationManager?
func createLocationRequest(completionHandler: CompletionHandler){
self.completionHandler = completionHandler
locationManager = CLLocationManager()
locationManager!.delegate = self
locationManager!.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager!.distanceFilter = 10
locationManager!.requestWhenInUseAuthorization()
locationManager!.startUpdatingLocation()
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("Error while updating location " + error.localizedDescription)
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let locationArray = locations as NSArray
let locationObj = locationArray.lastObject as! CLLocation
locationManager!.stopUpdatingLocation()
locationManager!.stopMonitoringSignificantLocationChanges()
executeProcess(self.completionHandler!, location: locationObj)
locationManager!.delegate = nil
}
func executeProcess(completionHandler: CompletionHandler, location:CLLocation) {
let latitude = location.coordinate.latitude.description
let longitude = location.coordinate.longitude.description
let request = NSMutableURLRequest(URL: NSURL(string: CommonUtils.google_geoCode_url + "?latlng=\(latitude),\(longitude)&key=\(CommonUtils.google_server_key)")!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "GET"
print("CountryCodeURL:\(request.URL)")
let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
if(data==nil){
// self.buildErrorOnSignIn()
}else{
self.parseResponse(data!, completionHandler: completionHandler)
}
})
task.resume()
}
func parseResponse(data:NSData, completionHandler: CompletionHandler){
let dict: NSDictionary!=(try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)) as! NSDictionary
let status_str=dict.valueForKey("status") as! NSString
if(status_str != "OK" || dict.valueForKey("results") == nil){
dispatch_async(dispatch_get_main_queue()) {
completionHandler(countryCode: "")
}
return;
}
let results_arr = dict.valueForKey("results") as! NSArray
if(results_arr.count > 0){
var countryCode_temp = ""
var isCountryCodeMatch = false
for i in 0 ..< results_arr.count{
let addressComponents = results_arr[i].valueForKey("address_components")
if(addressComponents != nil){
let addressComponents_arr = addressComponents as! NSArray
for j in 0 ..< addressComponents_arr.count {
let types_arr = addressComponents_arr[j].valueForKey("types") as! NSArray
for k in 0 ..< types_arr.count {
let type = String(types_arr.objectAtIndex(k))
if(type == "country"){
countryCode_temp = String(addressComponents_arr[j].valueForKey("short_name")!)
isCountryCodeMatch = true
break
}
}
if(isCountryCodeMatch == true){
break
}
}
if(isCountryCodeMatch == true){
break
}
}
}
print("countryCode_temp::\(countryCode_temp)")
dispatch_async(dispatch_get_main_queue()) {
completionHandler(countryCode: countryCode_temp)
}
}else{
dispatch_async(dispatch_get_main_queue()) {
completionHandler(countryCode: "")
}
}
}
}
// Usage of class
/*let getCountryeCode = GetCountryCode()
getCountryeCode.createLocationRequest({ (response) -> Void in
print("Response:\(response)")
})*/
Почему вы делаете locationManager! .delegate = nil в этом методе ?? Метод didUpdateLocation будет вызываться много раз, как только будет обновлено местоположение. –
Мне нужно место только для первого раза. Не требуется обновление местоположения из-за того, что я хочу найти страну местоположения пользователя. –