Swift和Objective-C之间的键值观察(KVO)

时间:2016-01-05 20:21:09

标签: objective-c swift interop key-value-observing

我在Swift中构建一个ViewController,以便在Objective-C类发生状态更改时进行更新。其他人写过ObjC;我正在实现Swift视图。

虽然从概念上了解NSNotification,代表和回调 1 ,但我希望采用键值观察(KVO)。

Apple有关于KVO 2 和Swift 3 的概述文档。其他人已经单独记录了Swift 4 和ObjC 5 ,但目前尚不清楚如何使用混合Swift实现KVO / ObjC环境。

在阅读完之前的StackOverflow讨论后,不清楚。 Is key-value observation (KVO) available in Swift?

据了解,Swift对象是Observer,而ObjC对象是Observed。还明白Observer继承自NSObject。

我希望每次ObjC实例变量lastUpdate发生变化时,都要更新Swift ViewController,特别是lastRealTimeSynchronizeDate变量。

仍然不确定如何以及表达我想要观察的属性的依赖关系,在何处以及如何创建全局上下文变量以及关键路径的观察者如何工作。

下面附有示例代码,其中KVO尚未实施。

任何指导都将不胜感激。谢谢

下面的SynchronizeMgr.m:

- (void)synchronizeCompleted
{
    // standard date formatting
    NSDate *now = [NSDate date];
    NSString *dateString = [NSDateFormatter localizedStringFromDate:now
                                                          dateStyle:NSDateFormatterShortStyle
                                                          timeStyle:NSDateFormatterShortStyle];        

    // want Swift ViewController, lastUpdate, to be updated each time this ivar changes
    _lastRealTimeSynchronizeDate = dateString;
}

下面的SynchronizeStatus.swift:

class SynchronizeStatusViewController: UIViewController {

    @IBOutlet weak var lastUpdate: UILabel!

    func pullDate() -> String  {

        // retrieving from ObjC, lastRealTimeSynchronizeDate via sharedManager
        let m = SynchronizeMgr.sharedManager()
        let d = m.lastRealTimeSynchronizeDate

        if d == nil {

            return "nil"

        } else {

            return d

        }            
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // looking to have this update whenever lastRealTimeSynchronizeDate in ObjC is updated
        lastUpdate.text = pullDate()

    }  
}

0 个答案:

没有答案