Ios 不获取NSObject类中委托方法的回调
--类的用法在类的顶部文件中作为注释代码提到 --这个类用于查找用户的位置,然后使用google的API从location country获取 --即使我写了“locationManager.delegate=self”,也没有在locationManager的委托方法(如“didUpdateLocations”)中获得位置回调 --请检查下面的代码。我需要帮助guyz找出问题所在。如果这种类型的配置不可行,请建议我替换以下代码的替代代码块Ios 不获取NSObject类中委托方法的回调,ios,iphone,swift,swift2,Ios,Iphone,Swift,Swift2,--类的用法在类的顶部文件中作为注释代码提到 --这个类用于查找用户的位置,然后使用google的API从location country获取 --即使我写了“locationManager.delegate=self”,也没有在locationManager的委托方法(如“didUpdateLocations”)中获得位置回调 --请检查下面的代码。我需要帮助guyz找出问题所在。如果这种类型的配置不可行,请建议我替换以下代码的替代代码块 import UIKit import
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)")
})*/
导入UIKit
导入核心定位
类GetCountryCode:NSObject,CLLocationManagerDelegate{
//类的使用
/*让GetCountryCode=GetCountryCode()
GetCountryCode.createLocationRequest({(响应)->中的Void
打印(“响应:\(响应)”)
})*/
typealias CompletionHandler=(国家代码:字符串)->Void
变量completionHandler:completionHandler?
私有var locationManager:CLLocationManager?
func createLocationRequest(completionHandler:completionHandler){
self.completionHandler=completionHandler
locationManager=CLLocationManager()
locationManager!.delegate=self
locationManager!.desiredAccuracy=KCallocationAccuracyNearesttenmeters
locationManager!.distanceFilter=10
locationManager!.RequestWhenUseAuthorization()
locationManager!.startUpdatingLocation()
}
func locationManager(管理器:CLLocationManager,错误:N错误){
打印(“更新位置时出错”+错误.localizedDescription)
}
func locationManager(管理器:CLLocationManager,didUpdateLocations位置:[CLLocation]){
设locationArray=作为NSArray的位置
将locationObj=locationArray.lastObject设为!CLLocation
locationManager!.stopUpdatengLocation()
locationManager!.stopMonitoringSignificationLocationChanges()
executeProcess(self.completionHandler!,位置:locationObj)
locationManager!.delegate=nil
}
func executeProcess(completionHandler:completionHandler,位置:CLLocation){
设纬度=location.coordinate.latitude.description
让经度=location.coordinate.longitude.description
let request=NSMutableURLRequest(URL:NSURL(字符串:CommonUtils.google\u geoCode\u URL+“?latlng=\(纬度),\(经度)&键=\(CommonUtils.google\u服务器\u键)!)
let session=NSURLSession.sharedSession()
request.HTTPMethod=“GET”
打印(“CountryCodeURL:\(request.URL)”)
让task=session.dataTaskWithRequest(请求,completionHandler:{data,response,error->Void in
如果(数据==nil){
//self.buildErrorOnSignIn()
}否则{
parseResponse(data!,completionHandler:completionHandler)
}
})
task.resume()
}
func parseResponse(数据:NSData,completionHandler:completionHandler){
让dict:NSDictionary!=(试试!NSJSONSerialization.JSONObjectWithData(数据,选项:NSJSONReadingOptions.MutableContainers))作为!NSDictionary
将status_str=dict.valueForKey(“status”)设为!NSString
如果(状态?| str!=“OK”| dict.valueForKey(“结果”)==nil){
dispatch\u async(dispatch\u get\u main\u queue()){
completionHandler(国家代码:“”)
}
返回;
}
让results\u arr=dict.valueForKey(“results”)作为!NSArray
如果(结果\u arr.count>0){
var countryCode_temp=“”
var isCountryCodeMatch=false
对于0中的i.中的Void
打印(“响应:\(响应)”)
})*/
我认为类GetCountryCode的实例在调用委托方法之前被释放。在创建GetCountryCode实例后存储该实例。
如果这对你有帮助,请告诉我 我认为类GetCountryCode的实例是在调用委托方法之前释放的。在创建GetCountryCode实例后存储该实例。
如果这对你有帮助,请告诉我 你为什么要做locationManager!。该方法中的delegate=nil??didUpdateLocation方法将在位置更新后被多次调用。我只需要第一次使用位置。不需要位置更新,因为我想查找用户位置所在的国家/地区。为什么要使用locationManager!。该方法中的delegate=nil??didUpdateLocation方法将在位置更新后被多次调用。我只需要第一次使用位置。不需要位置更新,因为我想找到用户位置所在的国家/地区。