我认为最合适的解决方案(不要太过分,因为肯定有更彻底的方法可以解决这个问题)是将 gps 管理分离到它自己的单例类中,并订阅 trackerUpdated 协议以进行更新。
import Foundation
import placeWhereGPSTrackingManagerIs
protocol GPSManagerDelegate {
func didUpdateTracker(tracker: yourTrackerObject)
}
let _GPSManagerSharedInstance = GPSManager()
class GPSManager {
weak var delegate: GPSManagerDelegate?
let tracker: yourTrackerObject?
class var sharedInstance:GPSManager {
return _GPSManagerSharedInstance
}
init() {
tracker = GPSTrackingManager()
tracker.startUpdatingLocation()
}
func updateTracker(newInformation) // you'll want to pass whatever information your tracker needs here
{
tracker.trackerProperty = newInformation
self.delegate?.didUpdateTracker(tracker)
}
}
Swift 单例解释
Using a dispatch_once singleton model in Swift
现在,无论 startUpdatingLocation 做什么,都可以使用更新跟踪器所需的新信息调用此类中的 updateTracker。您还可以将该逻辑迁移到此处(我建议在这种情况下这样做),因此所有内容都包含在一个类中。
任何对信息感兴趣的视图控制器都可以订阅 didUpdateTracker 协议方法,该方法会将跟踪器传递给该视图控制器
import UIKit
class controllerOne: UIViewController, GPSManagerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
GPSManager.sharedInstance.delegate = self // set the GPSManager delegate
if let tracker = GPSManager.sharedInstance.tracker {
// if the tracker exists, we assign it to the "tracker" variable, and use as needed
// setup page with tracker
}
}
func didUpdateTracker(updatedTracker: yourTrackerObject) {
// protocol method that will be called from the gpsmanager everytime it updates
// do whatever updates to the page with the
}
}
由于您只能拥有一个 GPSManager 并且其 tracker 属性无法更改,因此向 GPS 管理器询问此跟踪器始终是安全的,该跟踪器仅在其初始化时调用 startUpdatingLocation()
您还可以像@shesh nath 提到的那样发布通知,如果您更喜欢委托方法,这是一种广播更改的完全有效的方法。无论您采用哪种方式,我都建议将跟踪器与视图控制器分开,以便视图控制器不是负责管理跟踪器状态的控制器。