View Controllers之间的一个类实例化swift共享

时间:2014-10-14 11:36:00

标签: ios xcode swift gps core-location

我在做这件事时遇到了一些麻烦。我有一个带有几个视图控制器的NavigationController。在第一个视图控制器中,我实例化一个新类,GPSTrackingManager:

var tracking = GPSTrackingManager()

因为我需要在此UINavController之后的所有视图控制器中提供GPS数据和功能。我已经在第一个VC中调用了这个,因此GPS可以获得早期修复。如何将此跟踪对象传递给新的视图控制器?我在prepareForSegue中尝试了几件事,但我目前没有想法。如果我把上面的代码放在新的VC中,那么我的startUpdatingLocation()运行了2次。如果你能指出我正确的方向,那将非常感激!

2 个答案:

答案 0 :(得分:2)

我认为最合适的解决方案(不要过于夸大,因为肯定有更彻底的解决方法)是将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且其跟踪器属性无法更改,因此向GPS管理员询问此跟踪器始终是安全的,该跟踪器仅在初始化时调用startUpdatingLocation()

您也可以在@shesh nath中提及通知,如果您更喜欢使用委托方法,这是广播更改的完全有效方式。无论哪种方式,我建议将跟踪器与视图控制器分开,以便视图控制器不是负责管理跟踪器状态的人。

答案 1 :(得分:0)

有几种方法可以实现它 1)使用键值观察器 2)通知

通知示例在您的第一个viewController帖子通知上,并将您的数据传递给此通知。

NSDictionary *data;
 [[NSNotificationCenter defaultCenter] postNotificationName:@"updateBeaconStateOnDetailScreen" object:data];

并在viewdidload示例上为此通知留下所有viewcontroller注册侦听器。

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateBeaconState:)name:@"updateBeaconStateOnDetailScreen" object:nil];

此通知将调用您的方法

  -(void) updateBeaconState:(NSNotification *) notification
 {   //notification raised from BeaconList with updated Beacon State
    NSDictionary *dictUpdatedBeacon=[notification valueForKey:@"object"];
 }