订阅房产

时间:2017-06-13 22:57:51

标签: ios swift swift3

我有一个单例服务类,它维护从指南针获取的标题值。我有一个UIView,它基于此绘制一些自定义图形。我尝试在javascript中执行像Observable这样的操作,我的代码会在值发生变化时执行。

final class LocationService: NSObject {

static let shared = LocationService()

public var heading:Int

public func getHeading() -> Int {

    return self.heading

}

然后在我的UIView子类中:

var ls:LocationService = LocationService.shared

var heading: Int = ls.getHeading() {
    didSet {
        setNeedsDisplay()
    }
}

我也尝试过直接通过ls.heading访问该属性,但这也没有被接受。它告诉我我不能在属性初始化器中使用实例成员。什么是一个适当的快速方法呢?

编辑:

我一直在使用克里斯蒂安的答案以及其他一些文档,现在到了这里所有编译得很好,但实际上并没有。这是我的委托人和协议:

final class LocationService: NSObject {

    static let shared = LocationService()

    weak var delegate: CompassView?

    var heading:Int

    func headingUpdate(request:HeadingRequest, updateHeading:CLHeading) {

        print ("New heading found: \(updateHeading)")

        self.heading = Int(updateHeading.magneticHeading)
        self.delegate?.setHeading(newHeading: Int(updateHeading.magneticHeading))

    }

    public func getHeading() -> Int {

        return self.heading

    }

}

protocol LSDelegate: class {

    func setHeading(newHeading:Int)

}

然后在代表中:

class CompassView: UIView, LSDelegate {

    func setHeading(newHeading:Int) {
        self.heading = newHeading

        print("heading updated in compass view to \(self.heading)")

        setNeedsDisplay()
    }

}

所以我得到了标题已在headingUpdate函数中更新的打印消息。委托CompassView中setHeading函数中的打印消息永远不会显示。

1 个答案:

答案 0 :(得分:2)

您可以使用委派模式,让想要使用您的事件的类实现协议中的功能。

protocol MyDelegate {
  func setNeedsDisplay()
}

class LocationService: NSObject {
  var myDelegate : MyDelegate?

  var heading: Int = ls.getHeading() {
    didSet {
        myDelegate?.setNeedsDisplay()
    }
  } 

  ...
  func assignDelegate() {
    self.myDelegate = MyConsumer()
  }
}

class MyConsumer : MyDelegate {
  func setNeedsDisplay()
  {
  }
}