Съкратете кода си и го направете по-ефективен

В този кратък урок ще научим как да създадем две последователности на 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, не се колебайте да разгледате другите ми подходящи части:







Благодаря ви много, че прочетохте!