निम्नलिखित उदाहरण होने:

import UIKit

@objc class ViewController: UIViewController {

    @objc dynamic var buggyApple: NSObject?

    var obs: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()
        obs = observe(\.buggyApple, changeHandler: { (obj, change) in
            print(change)
        })
        buggyApple = NSObject()
        buggyApple = NSObject()
    }
}

मुझे डीबग कंसोल में संबंधित आउटपुट मिलता है:

NSKeyValueObservedChange<Optional<NSObject>>(kind: __C.NSKeyValueChange, newValue: Optional(nil), oldValue: Optional(nil), indexes: nil, isPrior: false)
NSKeyValueObservedChange<Optional<NSObject>>(kind: __C.NSKeyValueChange, newValue: Optional(nil), oldValue: Optional(nil), indexes: nil, isPrior: false)

LLDB में कॉलबैक के अंदर ब्रेकपॉइंट पर ViewController ऑब्जेक्ट का निरीक्षण करते समय, मुझे निम्न मिलता है:

(lldb) po obj.buggyApple
▿ Optional<NSObject>
  - some : <NSObject: 0x600000908fa0>

तो, वास्तव में, नया NSObject सफलतापूर्वक भेजा गया है, हालांकि, change अभी भी संदर्भ nil है। क्या मेरे कोड में कोई समस्या है और इसे कैसे ठीक किया जाए?

2
Richard Topchii 3 जून 2019, 15:57

1 उत्तर

सबसे बढ़िया उत्तर

change में नया मान प्राप्त करने के लिए आपको observer विधि के options इनपुट तर्क के लिए new विकल्प की आपूर्ति करने की आवश्यकता है।

obs = observe(\.buggyApple, options: [.new], changeHandler: { (obj, change) in
    print(change)
})
9
Dávid Pásztor 3 जून 2019, 13:03