2017-01-09 2 views
0

私はSwift 3でコアロケーションマネージャを実装しました。デリゲートからロケーション値を取得し、クロージャの値を返しますが、そうすることはできませんでした。どんな助けもありがとう。Closureのコア位置デリゲートの値

マイコード:

import Foundation 
import CoreLocation 

class LocationManager : NSObject, CLLocationManagerDelegate{ 

var location: CLLocation? 
var locationManager : CLLocationManager? 
var currentLocation : CLLocationCoordinate2D? 
var latitude : String? 
var longitude : String? 
var lat : Float? 
var lon : Float? 

// var locationManagerCallback : (Float?,Float?,String?,String?) ->() 


static let sharedInstance : LocationManager = { 
    let instance = LocationManager() 
    return instance 
}() 


// MARK: - CLLocation Fetch Methods 

func fetchLocationWithCompletionHandler(completion : @escaping(Float?,Float?,String?,String?) ->()) -> Void { 

    if locationManager != nil { 

     locationManager?.stopUpdatingLocation() 
     locationManager?.delegate = nil 
     locationManager = nil 
    } 
    locationManager = CLLocationManager() 
    locationManager?.delegate = self 
    locationManager?.distanceFilter = kCLLocationAccuracyNearestTenMeters 
    locationManager?.desiredAccuracy = kCLLocationAccuracyBest 

    let requestWhenInUseSelector = NSSelectorFromString("requestWhenInUseAuthorization") 
    let requestAlwaysSelector = NSSelectorFromString("requestAlwaysAuthorization") 

    if (locationManager?.responds(to: requestWhenInUseSelector))! { 

     locationManager?.requestWhenInUseAuthorization() 

    }else if (locationManager?.responds(to: requestAlwaysSelector))!{ 

     locationManager?.requestAlwaysAuthorization() 
    } 
    locationManager?.startUpdatingLocation() 


} 

func requestWhenInUseAuthorization() -> Void { 

    let status : CLAuthorizationStatus = CLLocationManager.authorizationStatus() 
    if status == CLAuthorizationStatus.denied || status == CLAuthorizationStatus.restricted { 
     // TODO : Handle Denial Here 
    }else if status == CLAuthorizationStatus.notDetermined{ 
     locationManager?.requestWhenInUseAuthorization() 
    } 
} 
func requestAlwaysAuthorization() -> Void { 

    let status : CLAuthorizationStatus = CLLocationManager.authorizationStatus() 
    if status == CLAuthorizationStatus.denied || status == CLAuthorizationStatus.restricted { 
     // TODO : Handle Denial Here 
    }else if status == CLAuthorizationStatus.notDetermined{ 
     locationManager?.requestAlwaysAuthorization() 
    } 

} 


func reveseGeocode(currentLocation : CLLocation, completionCallback : @escaping(CLPlacemark?,Error?) -> Swift.Void) -> Void { 

    let reverseGeocoder : CLGeocoder = CLGeocoder() 
    reverseGeocoder.reverseGeocodeLocation(currentLocation) { (placemarkArray, error) in 

     let placemark : CLPlacemark = (placemarkArray?.first)! 
     completionCallback(placemark,error) 
    } 
} 


// MARK: - CLLocation Delegate Methods 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    self.location = locations[0] 
    currentLocation = self.location?.coordinate 
    lat = Float((currentLocation?.latitude)!) 
    lon = Float((currentLocation?.longitude)!) 
    latitude = String(format: "%lf",lat!) 
    longitude = String(format : "%lf",lon!) 

    UserDefaults.standard.set(lat, forKey: CURR_LAT_VAL) 
    UserDefaults.standard.set(lon, forKey: CURR_LON_VAL) 
    UserDefaults.standard.set(latitude, forKey: CURR_LAT_STR) 
    UserDefaults.standard.set(longitude, forKey: CURR_LON_STR) 
    UserDefaults.standard.synchronize() 

    print("\(lat)\(lon)\(latitude)\(longitude)") 

    // locManager(lat,lon,latitude,longitude) 

} 

func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) { 
    print("location manager did pause") 
} 

func locationManagerDidResumeLocationUpdates(_ manager: CLLocationManager) { 
    print("location manager did resume") 
} 

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 
    print("Location fetch failed with error : \(error.localizedDescription)") 
} 

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
    print("Authorization Changed") 
} 

} 

答えて

0

あなたは以下のように、あなたの 'LocationManager' クラスでブロック変数を保存する必要があります。

  1. は、あなたのクラスに変数を追加: するvar locationManagerCallbackを:(( Float?、Float?、String?、String?) - >())?

  2. 方法内側から終了ブロック/クロージャを保存: FUNC fetchLocationWithCompletionHandler(完了:@escaping(フロート、フロート、文字列、文字列) - >()????) - >ボイド{

..... locationManagerCallback =完了

.....

}

  • コールデリゲートメソッドから閉鎖: FUNCのlocationManager(_マネージャ:CLLocationManager、didUpdateLocations場所:[CLLocation])?{
  • .... locationManagerCallback(緯度、経度、緯度、経度)

    .... }

    以下

    あなたが他のクラスからこれを使用する方法である。

    LocationManager.sharedInstance.fetchLocationWithCompletionハンドラー{(緯度、経度、緯度、経度)in print( "(緯度)(経度)(経度)") }

    希望します。

    +0

    チャームのように働いた!ありがとう –

    関連する問題