Как наблюдать за изменениями свойств массива в 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)
}

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


person kilik52    schedule 03.03.2016    source источник


Ответы (1)


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

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

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

myArray = Variable(["a"])

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

myArray.value = ["b"]

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

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

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

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

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

person tomahh    schedule 04.03.2016
comment
использование переменной дает следующее сообщение из библиотеки RXSwift: [УСТАРЕЛО] Variable планируется исключить в будущем. Пожалуйста, рассмотрите BehaviorRelay как замену. Подробнее читайте на странице: git.io/vNqvx есть идеи, что еще использовать для наблюдения за массивом? - person Shabarinath Pabba; 23.04.2018