2017-01-31 2 views
0

- Использование класса упоминается в файле верхнего уровня класса как прокомментированный код.Не получать обратные вызовы методов делегатов в классе 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)") 

    })*/ 
+0

Почему вы делаете locationManager! .delegate = nil в этом методе ?? Метод didUpdateLocation будет вызываться много раз, как только будет обновлено местоположение. –

+0

Мне нужно место только для первого раза. Не требуется обновление местоположения из-за того, что я хочу найти страну местоположения пользователя. –

ответ

0

Я думаю, что экземпляр вашего класса GetCountryCode освобождается до вызова метода делегата. Сохраните этот экземпляр GetCountryCode после его создания. Сообщите мне, если это вам помогло.

Смежные вопросы