2017-07-14 38 views
0

Apple Docs建議不要將CLLocationManager存儲在本地變量中。所以我創建了一個全局常量,在我的ViewController類的範圍之外,就在import聲明之後。試圖訪問類裏面的常量,然而,拋出編譯器錯誤:創建全局CLLocationManager時出錯

Xcode example screenshot

NSMutableDictionary類型的類似聲明globalDictionary常數似乎是類的內部訪問。

這是什麼,我在這裏做錯了? 爲什麼上述不起作用?


代碼

// 
// ViewController.swift 
// CoreLocationExample 
// 
// 

import UIKit 
import CoreLocation 
import Foundation 

let locationManager = CLLocationManager() 
let globalDictionary = NSMutableDictionary() 
class ViewController: UIViewController, CLLocationManagerDelegate { 

// let locationManager = CLLocationManager() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     locationManager.delegate = self 
     locationManager.requestWhenInUseAuthorization() 

     let dict = [ 
      "name":"John" 
     ] 
     globalDictionary.addEntries(from: dict) 
     print(globalDictionary) 
    } 
} 

上的Xcode版本使用斯威夫特3 8.3.1

+0

添加你的代碼.. –

+2

2017和有人仍然使用全局變量...創建一些類,即'MyLocationManager'它將容納'CLLocationManager'。通過單例實例訪問'MyLocationManager' –

+0

爲什麼你用變量「let」? –

回答

-1

你可以做到這一點通過以下方式 -

class LocationTracker { 
static var locationManager: CLLocationManager? = LocationTracker.sharedLocationManager() 

class func sharedLocationManager() -> CLLocationManager { 

    let lockQueue = DispatchQueue(label: "self") 
    lockQueue.sync { 
     if _locationManager == nil { 
      _locationManager = CLLocationManager() 
      _locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation 
      _locationManager?.allowsBackgroundLocationUpdates = true 
      _locationManager?.pausesLocationUpdatesAutomatically = false 
     } 
    } 
    return _locationManager! 
} 

}

而且當你需要調用它在你的代碼,你可以做以下 -

var locationManager: CLLocationManager? = LocationTracker.sharedLocationManager() 

然後你可以在這個類以及像startt跟蹤添加其他位置相關的方法,更新位置,stoptracking等

+0

downvote的任何原因 –

+0

該代碼看起來很奇怪。爲什麼類func被命名爲'sharedLocationManager',如果它只是返回新的實例? –

+0

對不起沒有。它返回新的實例,如果沒有它的現有實例,否則它返回現有的實例。此外,新實例是在一個同步塊中創建的。我在這裏做錯了什麼? –

0

使用單例類此

進口的UIKit 進口CoreLocation

公共類的LocationManager:NSObject的,CLLocationManagerDelegate {

public static let sharedInstance = LocationManager() 
public lazy var locationManager: CLLocationManager = CLLocationManager() 
var globalDictionary = NSMutableDictionary() 

public override init() { 
    super.init() 
    self.locationManager.requestAlwaysAuthorization() 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    self.locationManager.distanceFilter = kCLDistanceFilterNone; 
    self.locationManager.startUpdatingLocation() 
    self.locationManager.delegate = self 
    let dict = [ 
     "name":"John" 
    ] 
    self.globalDictionary.addEntries(from: dict) 
    print(self.globalDictionary) 
} 

// MARK: - Location Manager Delegate 
public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 

    print(error) 
} 

public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){ 
    let newLocation: CLLocation? = locations.last 
    let locationAge: TimeInterval? = -(newLocation?.timestamp.timeIntervalSinceNow)! 
    if Double(locationAge!) > 5.0 { 
     return 
    } 
    if Double((newLocation?.horizontalAccuracy)!) < 0 { 
     return 
    } 
} 

public func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 

} 

}

+0

創建單例類聽起來像是避免局部變量的一個很好的解決方案。這也是@mag_zbc之前提出的。爲什麼子類'NSObject'呢?無論如何,你的回答並沒有解決爲什麼我正在尋找的錯誤正在產生的問題。 – ByteMan2021

1

蘋果文檔建議不要你CLLocationManager存儲在一個局部變量。 這意味着不要在方法/函數中創建本地實例。

請聲明這樣。

類的AppDelegate:UIResponder,UIApplicationDelegate {

//CLLocation Manager 
let locationManager = CLLocationManager() 
var locValue = CLLocationCoordinate2D() 

}

CLLocation經理或globalDictionary類裏面。

+1

「Apple Docs建議不要將CLLocationManager存儲在本地變量中,這意味着不要在方法/函數內創建本地實例。」 - 有趣的觀點。雖然不完全相信。 **不是類變量仍然是「本地」的,因爲它的作用域和限制是在該類中使用的嗎?**在你的答案中,我將無法訪問'AppDelegate'之外的'locationManager'(例如在UIViewController子類中)。 – ByteMan2021

+0

是的,它會讓appDelegate = UIApplication.shared.delegate as! AppDelegate appDelegate.locationManager.stopUpdatingLocation() –

+0

謝謝Abhishek。沒有想到這一點!我認爲使用單例實例是創建全局'CLLocationManager'的常用解決方案。任何爲什麼'locationManager'錯誤和'globalDictionary'都沒有的原因在上面的截圖中? – ByteMan2021