как наблюдать новые значения массива SignalProducer - PullRequest
0 голосов
/ 24 октября 2018

У меня есть SignalProducer, который содержит массив, я хочу наблюдать только новые изменения, а не получать весь массив при его наблюдении

Я пытаюсь использовать flatMap .latest, но он не работает

У кого-нибудь есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я полагаю, что оператор .skipRepeats() сделает всю работу за вас.

Он просто перенаправит значения, которые не равны его немедленному действующему значению, и также будет работать для массива.

Просто помните, что ваши элементы массива должны соответствовать Equatable.

yourProducer.skipRepeats().startWithValues {newValues in
            //do your stuff here
        } 

Этот метод также хорошо работает, поскольку он фильтрует только новые значения и перенаправляет только отдельные значения:

yourProducer.combinePrevious().map({val -> [String] in
            let (prev, current) = val
            return current.filter({!prev.contains($0)})
        }).startWithValues {newValues in
            //do your stuff here
        }
0 голосов
/ 24 октября 2018

Нет единственной доступной функции, которая делает это, но вы можете реализовать это, используя combinePrevious:

let change = producer.combinePrevious([]).map { (previous, current) in
  // Calculate change
  return change
}

Однако, как вы вычисляете изменение между предыдущим массивом и текущим массивом, зависито том, что именно означает «только новые изменения» в вашем контексте.

Хотите ли вы элементы, которые были добавлены?Элементы, которые были удалены?Допускаются ли дубликаты?Имеет ли значение позиция и имеет ли это изменение включение позиции?

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

Например:

let p = MutableProperty([1, 2, 3])

let added = p.producer.map(Set.init)
  .combinePrevious([])
  .map { (previous, current) in
    return current.subtracting(previous)
}

added.startWithValues { print($0) }

p.value = [1, 2, 3, 4]
p.value = [2, 4]
p.value = [1, 2, 3, 4, 5, 6]
...