我有一个单例服务类,它维护从指南针获取的标题值。我有一个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函数中的打印消息永远不会显示。
答案 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()
{
}
}