Как наблюдать за изменениями свойств массива в RxSwift

вот мой класс:

class ViewController: UIViewController {
   var myArray : NSArray!
} 

Я хочу запускать событие каждый раз, когда myArray указывает на новый массив, например:

self.myArray = ["a"]

self.myArray = ["b"]

Я пробовал rx_observe, но не удалось, вот мой код:

self.rx_observe(NSArray.self, "myArray").subscribeNext { (array) -> Void in
   print(array)
}

он срабатывает только в первый раз, в чем проблема?

1 ответов


большую часть времени, если у вас есть контроль над переменной поддержку, вы предпочтете Variable С использованием rx_observe.

class ViewController: UIViewController {
   var myArray : Variable<NSArray>!
}

в первый раз, когда вы будете использовать myArray, вы бы asign его так

myArray = Variable(["a"])

затем, если вы хотите изменить его значение

myArray.value = ["b"]

и вы можете легко наблюдать его изменения, используя

myArray.asObservable().subscribeNext { value in
  // ...
}

если вы действительно хотите использовать rx_observe (возможно, потому, что переменная используется в другом месте вашей программы, и вы не хотите менять API вашего контроллера вида), вам нужно будет объявить myArray as dynamic (другое требование заключается в том, что класс хостинга является дочерним NSObject здесь UIViewController удовлетворяет этому требованию). KVO не реализован по умолчанию в swift, и использование dynamic гарантирует, что доступ осуществляется с помощью среды выполнения objective-c, где обрабатываются события KVO.

class ViewController: UIViewController {
  dynamic var myArray: NSArray!
}

документация для этого можно найти здесь