2016-03-22 15 views
0

私は自分のアプリを整理している方がいいですし、CoreLocationを使ってクラス間で問題を抱えています。私のアプリはiBeaconを検出し、その座標をAPIに送信します。位置座標を別のクラスで更新するにはどうすればよいですか?

AppDelegateではRunLocation()を呼び出しています。RunGPS()はcreateLocationManagerをトリガーし、座標を更新してAPIに送信します。私のコンソール出力は、「場所の更新」で必要なものすべてを出力します。経度と緯度に関する何も私に何かをねじ込んだと信じているが、私は何も知らない。

私はそれが不器用にViewControllerにまとめられているときに動作します。私は別のクラスに分割されているので、私は今何かをねじっていると思っています。

関連するコード:

func runGPS(){ 
     print("Running GPS") 
     createLocationManager(startImmediately: true) 
    } 

    func createLocationManager(startImmediately startImmediately: Bool){ 
     locationManager = CLLocationManager() 
     onSwitch = true 
     if let manager = locationManager 
     { 
      print("Successfully created the location manager") 
      manager.delegate = self 
      if startImmediately 
      { 
       if onSwitch == true { 
        manager.startUpdatingLocation() 
        print("Updating Location") 
       }else{ 
        print("Off") 
       } 
      } 
     } 
    } 

    func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation){ 
//  Stop updating location is onSwitch is false. If true, user has called for help. Turn on GPS and execute a post to the API 
     if onSwitch == false 
     { 
      locationManager.stopUpdatingLocation() 
      print("Location updates off") 
     } 
     else 
     { 
      loadCoreData() 
      loadUser() 
      print("Updating location") 

      let latitude:String = "\(newLocation.coordinate.latitude)" 
      let longitude:String = "\(newLocation.coordinate.longitude)" 

      print("Latitude = \(newLocation.coordinate.latitude)") 
      print("Longitude = \(newLocation.coordinate.longitude)") 

      //Posting to the API which generates a map and sends SMS messages 
      post(["device_id":"\(deviceID)", "sender":"\(username)", "longitude":"\(longitude)", "latitude":"\(latitude)", "contacts":"\(phoneArray)"], url: "http://ring-api.herokuapp.com/api/v1/alerts") 

      //API has been called so stop posting 
      onSwitch = false 
     } 
    } 

コンソール出力:

2016-03-22 10:39:14.689 MangosBeta0.4[1531:677382] You entered the region 
Running GPS 
Successfully created the location manager 
Updating Location 

答えて

2

あなたはインスタンス変数としてロケーションマネージャを続ける場合は、このように、現在のアプリケーションのデリゲートのプロパティにアクセスすることによって、どこからでもアクセスすることができます。

if let delegate = UIApplication.sharedApplication().delegate as? AppDelegate { 
    let manager = delegate.locationManager 
} 

実際には、アプリのアーキテクチャを改善しようとしている場合、私は個人的にアプリケーションのデリゲートに位置ロジックを配置しません。それは私にとって間違った決定のように感じる。私があなたの場合は、両方の問題に対処するLocationManagerシングルトンクラスを作成します。

依存するクラスをリアルタイムで更新する必要がある場合は、NSNotificationをポストし、更新が必要なクラスで待機します。

1

代理人のメソッドが呼び出されていません。startUpdatingLocationを呼び出す前に、requestAlwaysAuthorization()またはrequestWhenInUseAuthorization()を呼び出していないと思います。 info.plistファイルを編集して以下を追加してくださいまたはNSLocationWhenInUseUsageDescription

+0

アーキテクチャ賢明@Dareはあなたの偉大な答えを与えています。 –

0

これを行うには、位置管理を別のクラス(別名:LocationController)に分解し、initメソッドでシングルトンインスタンスとしてインスタンス化する方法があります。

public class LocationController { 
    static let sharedInstance = LocationController() 

} 

次に、AppDelegateからインスタンス化し、アプリ内の任意のコントローラーから参照できます。あなたのApplicationDidFinishLaunchingWithOptionsで:

self.locationController = LocationController() 

は、あなたのLocationControllerがlocationManagerからのコールバックを取得し、NSNotificationsを使ってアプリの他の部分に適切に情報を配布してもらいます。

func viewDidLoad (...) { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector:"locationChanged:", name: "locationChanged", object: nil) 
} 

func locationChanged(notification: NSNotification?) { 
    guard let data = notification?.userInfo?["data"] as? YourData else {return} 
} 

をそしてあなたの場所コントローラからのものを投稿:アップデートに興味

ビューコントローラは、彼らのために登録することができます

let userInfo = ["data": mydata] 
NSNotificationCenter.defaultCenter().postNotificationName("locationChanged", object: nil, userInfo: info) 
関連する問題