2017-12-06 8 views
1

Swift의 싱글 톤 속성에서 KVC를 사용할 수 있는지에 대한 내 질문이 생겼습니다. 한 클래스에서 KVC를 테스트 중이 었는데 작동시킬 수 있었지만 그것이 Singleton 클래스에서 작동하는지 확인하기로 결정했습니다.
내 싱글 톤의 "공유"속성이 KVC와 호환되지 않는다는 오류가 나타납니다.싱글 톤 패턴이있는 KVC 사용

class KVOObject: NSObject { 
    @objc static let shared = KVOObject() 
    private override init(){} 

    @objc dynamic var fontSize = 18 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    addObserver(self, forKeyPath: #keyPath(KVOObject.shared.fontSize), options: [.old, .new], context: nil) 
} 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if keyPath == #keyPath(KVOObject.shared.fontSize) { 
     // do something 
    } 
} 

나는 현재 아래의 오류를 얻고있다 : 인해 캐치되지 않는 예외 'NSUnknownKeyException'응용 프로그램 종료, 이유는 *** :

NetworkCollectionTest [452848 9714] : '[addObserver : forKeyPath : 공유 "@합니다. fontSize "options : 3 context : 0x0]"공유 "속성에 대해 KVC와 호환되지 않는 객체로 전송되었습니다. '

+1

키 경로는 '#keyPath (KVOObject.fontSize)'입니까? – Rob

+0

'#keyPath (KVOObject.fontSize)'를 사용하면 작동하지만 'KVOObject.shared.fontSize' 속성을 변경하면 관찰되지 않습니다. – victorydub

+0

그건 작동합니다! 감사 – victorydub

답변

1

키 경로가 잘못되었습니다. KVOObject.fontSize입니다. 그리고 당신은 그 싱글에 관찰자를 추가해야합니다 : 당신은 아마 당신이 취급하고 있는지 여부가에 의해 사용될 수 있는지 여부를 식별하기 위해 컨텍스트를 사용한다 (a)는 옆으로

KVOObject.shared.addObserver(self, forKeyPath: #keyPath(KVOObject.fontSize), options: [.old, .new], context: nil) 

, 수퍼 클래스; (b) 귀하가 아닌 경우 super 구현물로 전화해야합니다. 및 (c) deinit에 관찰자를 제거해야합니다 : 그것은 폐쇄 기반 (문맥에 대한 필요성을 피하는) 그리고 자동으로 제거 될 때 스위프트 4, 그것은 훨씬 쉽게 경우,

class ViewController: UICollectionViewController { 

    private var observerContext = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     KVOObject.shared.addObserver(self, forKeyPath: #keyPath(KVOObject.fontSize), options: [.new, .old], context: &observerContext) 
    } 

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
     if context == &observerContext { 
      // do something 
     } else { 
      super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) 
     } 
    } 

    deinit { 
     KVOObject.shared.removeObserver(self, forKeyPath: #keyPath(KVOObject.fontSize)) 
    } 

    ... 
} 

을 때 또는 NSKeyValueObservation 폭포 범위를 벗어남 :

class ViewController: UICollectionViewController { 

    private var token: NSKeyValueObservation? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     token = KVOObject.shared.observe(\.fontSize, options: [.new, .old]) { [weak self] object, change in 
      // do something 
     } 
    } 

    ... 
}