RX Observables - Какой смысл «со временем», если я не могу изменить это значение? - PullRequest
0 голосов
/ 28 января 2019

Я изучаю RXSwift, и я немного запутался в Observables.Я понял теорию, что она может генерировать события «со временем».Но я должен инициализировать его значением, подписаться и использовать это значение (которое не имеет смысла), но я не могу изменить значение этого наблюдаемого позже, поэтому какой смысл говорить, что он может выдавать значения «со временем»???Может кто-нибудь объяснить это мне?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Ошибка, которую вы делаете, заключается в том, что вы должны «инициализировать [наблюдаемое] значением»;ты этого не делаешь.Вместо этого вы инициализируете наблюдаемое с помощью процедуры, которая выдает (ноль или более) значений .

Возможно, конкретный пример поможет ...

let search = searchTextField.rx.text.orEmpty.asObservable()

searchПеременная выше имеет тип Observable<String>.Он «излучает события во времени», когда пользователь печатает в текстовом поле.Теперь с некоторой подходящей цепочкой для этой наблюдаемой код сможет, например, фильтровать массив пользовательских объектов только для тех, у кого есть текст поиска в их имени.

Видите ли, searchTextField.rx.text былне было инициализировано значением, оно было инициализировано процедурой, которая отслеживает ввод пользователя в текстовое поле.

Или другой пример:

let result = URLSession.shared.rx.data(request: URLRequest(url: URL(string: "http://myURL.com")!))

В приведенном выше примере я инициализируюresult с процедурой, которая при подписке отправит сетевой запрос и выдаст результат.

0 голосов
/ 28 января 2019

Это правда, что вы не можете изменить значение Observable напрямую , потому что не имеет смысла иметь Observable.В этом случае вы можете просто вернуть значение и изменить его в строке без использования наблюдаемого.

Думайте о наблюдаемом просто как о последовательности событий, упорядоченных по времени.В структуре данных последовательности вы не управляете непосредственно или не изменяете то, что находится внутри них, что вы обычно делаете, чтобы отобразить их во что-то другое, отфильтровать события, которые вы хотите исключить, основываясь на определенном условии, или объединить их с другой последовательностью.

Например, вы можете map эти события, которые можно описать как e(t), с горизонтальной линией, представляющей поток времени.

--1--2--3--4--5--6--|

на его кратные:

func duplicate(event: Int) -> Int {
    return event * 2
}

--2--4--6--8--10--12--|

впоследствии, filter им

func clip(event: Int) -> Int {
    return event < 10
}

--2--4--6--8--|

Затем, представьте, что эти последовательности представляют собой последовательность любого типа, это может быть результатом нескольких ответов HTTP от нескольких запросов, которые вы объединяете вместе.

Это может быть Void, который обычно является результатом события UIControl.Вы можете взглянуть на документацию здесь:

ControlProperty / ControlEvent

Однако, если вам действительно нужна мутация, взгляните на BehaviorRelay.

...