ios - View Controller 之间的一类实例化快速共享

标签 ios xcode swift gps core-location

我在做对这件事时遇到了一些麻烦。我拥有的是一个带有多个 View Controller 的 NavigationController。在第一个 View Controller 中,我实例化了一个新类 GPSTrackingManager:

var tracking = GPSTrackingManager()

因为我需要在这个 UINavController 之后的所有 View Controller 中提供 GPS 数据和功能。我已经在第一个 VC 中调用它,这样 GPS 就可以得到早期修复。我怎样才能将这个跟踪对象传递给新的 View Controller ?我在 prepareForSegue 中尝试了几件事,但我目前没有想法。如果我将上面的代码放在新的 VC 中,那么 startUpdatingLocation() 将运行 2 次。如果您能指出正确的方向,我将不胜感激!

最佳答案

我认为最合适的解决方案(不过分,因为肯定有更彻底的方法来解决这个问题)是将 gps 管理分离到它自己的单例类中,并订阅 trackerUpdated 协议(protocol)以进行更新。

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。您还可以将该逻辑迁移到此处(我建议在这种情况下这样做),以便所有内容都包含在一个类中。

任何对该信息感兴趣的 View Controller 都可以订阅 didUpdateTracker 协议(protocol)方法,该方法会将跟踪器传递给该 View Controller

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 并且它的跟踪器属性不能改变,所以向 GPS 管理器询问这个跟踪器总是安全的,它只在初始化时调用 startUpdatingLocation()

您也可以像@shesh nath 提到的那样发布通知,如果您更喜欢委托(delegate)方法,这是一种广播更改的完全有效的方式。无论采用哪种方式,我都建议将跟踪器与 View Controller 分开,这样 View Controller 就不会负责管理跟踪器状态。

关于ios - View Controller 之间的一类实例化快速共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26359863/

相关文章:

ios - 当蓝牙设备在附近时唤醒 ios 应用程序

ios - 为 UICollectionViewLayout 使用失效上下文

ios - iOS 13点击webview链接崩溃

ios - 更改 .swift 以连接到 TableView Controller 而不是 View Controller

string - 在 Swift 中存储指针

ios - 在 ARSCNVIEW 中绘制一个 SCNNode,而不考虑相机的位置

ios - Xcode Time Profiler 显示地址而不是符号

iOS 应用程序 : running on simulator but not building the. 应用程序

xcode - 如何通过拖放到模拟器窗口来安装应用程序?

ios - 如何调整 UIImage 的大小以减小上传图片的大小