Съкратете кода си и го направете по-ефективен
В този кратък урок ще научим как да създадем две последователности на RxSwift Observable
и да ги веригираме.
Примерното приложение показва UITextField
в горната част на екрана. Той изчаква въвеждане от потребителя и когато потребителят е въвел пет букви, съдържащи „rx“, UITextField
мига в зелено и се опреснява:
„Изходният код на проекта“ е достъпен в GitHub.
Да започваме
Първо, нека бързо създадем и позиционираме нашия textField
на екрана:
Сега добавете следните импортирания в горната част на файла:
import RxSwift import RxCocoa
Трябва да добавим свойството disposeBag
, за да освободим абонаменти в бъдеще:
private let disposeBag = DisposeBag()
Вече сме готови да създадем нашите последователности.
Създаване на наблюдаеми последователности
Нека започнем с първата задача: намиране на „rx“ във въведения низ:
Ще извикаме този метод за търсене, след като потребителят въведе буква. Ако успее, ще излъчи стойност true
. Ако не, вместо това ще бъде излъчена стойността false
.
За да създадем метод за втората задача, анимиране и изчистване на textField
, пишем следния код:
Както виждаме, този метод изпълнява кратка анимация от 0,2 секунди, която променя свойството backgroundColor
на textField
. При завършване изпълняваме друга анимация, връщайки backgroundColor
в предишното му състояние и излъчваме събитието true
към observer
.
Сега е време да свържем тези чисто нови наблюдаеми.
Верижни наблюдаеми
Трябва да създадем метод, който ще поддържа обвързвания за textField
:
Ето разбивката на това, което се случва при този метод:
- Използвайки метода
.orEmpty
, трансформираме незадължителния типString?
вString
. - Ние филтрираме всички събития, при които броят на текстовете на
textField
не е равен на пет. Когато е равно на пет, изпълняваме метода.flatMap
. - Методът
.flatMap
променя типа на последователността отObservable<String>
наObservable<Bool>
, защото това е типът, който методътfindSubstring(in: )
връща. - Позволяваме само
true
събития да преминат следващи, което означава, че поднизът „rx“ е намерен. - В следващия
.flatMap
метод анимирамеtextField
и връщаме нова последователност от типObservable<Bool>
, която излъчваtrue
събитие при завършване на анимацията. - Когато анимацията е завършена, ние предаваме изискванията на метода
.filter
. - В
.subscribe
ние просто отпечатваме „Абониран“, за да отстраним грешки в изпълнението. - Накрая добавяме абонамента към
disposeBag
, който ще го освободи.
Не забравяйте да добавите метода bindTextField()
към viewDidLoad
:
Успешно създадохме и свързахме наблюдаеми последователности.
Нашият окончателен файл ViewController.swift
сега изглежда така:
Обобщавайки
Видяхме колко лесно е да се свържат различни наблюдаеми последователности с помощта на функцията .flatMap
. Ако сте любопитни да научите повече за това какво можете да правите с RxSwift, не се колебайте да разгледате другите ми подходящи части:
Благодаря ви много, че прочетохте!