ΠΊΠ°ΠΊ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² combine ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ
MVVM Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Combine Π² UIKit ΠΈ SwiftUI ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Π΄Π»Ρ UIKit ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
ΠΠΎΠ΄ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° Github.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ( UI ) Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΠ΅Π³ΠΎ 2 UI ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°: ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° Π³ΠΎΡΠΎΠ΄Π° ΠΈ ΠΌΠ΅ΡΠΊΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ. Π’Π΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° Π³ΠΎΡΠΎΠ΄Π° β ΡΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΠ₯ΠΠ ( Input ), Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΠ°Ρ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΌΠ΅ΡΠΊΠ° β ΠΏΠ°ΡΡΠΈΠ²Π½ΡΠΉ ΠΠ«Π₯ΠΠ ( Output ).
Π ΠΎΠ»Ρ View Model Π² Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ MVVM ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½Π° Π±Π΅ΡΠ΅Ρ ΠΠ₯ΠΠ(Π«) Ρ View (ΠΈΠ»ΠΈ ViewController Π² UIKit ), ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΠ«Π₯ΠΠΠ« Π½Π°Π·Π°Π΄ Π² View (ΠΈΠ»ΠΈ ViewController Π² UIKit ), Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π² Π½ΡΠΆΠ½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅.
Π‘ΠΎΠ·Π΄Π°ΡΡ View Model Ρ ΠΏΠΎΠΌΠΎΡΡΡ Combine Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠ°Ρ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠ° β ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π°Ρ ΠΈΠ»ΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π°Ρ β ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ObservableObject ΠΊΠ»Π°ΡΡ Ρ Π΅Π³ΠΎ @Published ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ.
ΠΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ ΠΈ API ΡΠ΅ΡΠ²ΠΈΡΠ° OpenWeatherMap
Π₯ΠΎΡΡ ΡΠ΅ΡΠ²ΠΈΡ OpenWeatherMap ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΎΡΠ΅Π½Ρ ΠΎΠ±ΡΠΈΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π΅, ΠΠΎΠ΄Π΅Π»Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠΈΡ Π½Π°Ρ Π΄Π°Π½Π½ΡΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠΉ, ΠΎΠ½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ WeatherDetail ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠΎΠ³ΠΎΠ΄Π΅ Π² Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌ Π³ΠΎΡΠΎΠ΄Π΅ ΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ Model.swift:
API Π΄Π»Ρ ΡΠ΅ΡΠ²ΠΈΡΠ° OpenWeatherMap ΠΌΡ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΠΌ Π² ΡΠ°ΠΉΠ»Π΅ WeatherAPI.swift. Π¦Π΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠΉ Π΅Π³ΠΎ ΡΠ°ΡΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ±ΠΎΡΠΊΠΈ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π΅ WeatherDetail Π² Π³ΠΎΡΠΎΠ΄Π΅ city :
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ View Model
ΠΠ°ΠΊ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ?
ΠΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π½ΡΠΆΠ½ΠΎΠΌΡ ΠΈΠ·Π΄Π°ΡΠ΅Π»Ρ fetchWeather (for city: String) Π² Combine Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ flatMap :
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ flatMap ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ».
ΠΠ°Π»Π΅Π΅ ΠΌΡ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡΒ» Π½Π° ΡΡΠΎΠ³ΠΎ Π²Π½ΠΎΠ²Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°Β» assign (to: \.currentWeather, on: self) ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΎΡ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ @Published ΡΠ²ΠΎΠΉΡΡΠ²Ρ currentWeather :
ΠΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π² init( ) ΠΠ‘ΠΠΠ₯Π ΠΠΠΠΠΠ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» ΠΈ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π»ΠΈΡΡΒ» Π½Π° Π½Π΅Π³ΠΎ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ² AnyCancellable Β«ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡΒ».
ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΡΡΡ AnyCancellable Β«ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ°Β» Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ cancellableSet Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° store ( in: &self.cancellableSet) :
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ debounce ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΠΊΠΎΠ½ΡΠΈΡ Π½Π°Π±ΠΈΡΠ°ΡΡ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ΅ΡΡΡΡΠΎΠ·Π°ΡΡΠ°ΡΠ½ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ UI Ρ ΠΏΠΎΠΌΠΎΡΡΡ SwiftUI
Π’Π΅ΠΏΠ΅ΡΡ, Π»ΡΠ±ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ @Published ΡΠ²ΠΎΠΉΡΡΠ² Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ ΠΊ Β«ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠ΅Β» View :
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ UI Ρ ΠΏΠΎΠΌΠΎΡΡΡ UIKit
Π UIKit ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ Π½Π°Ρ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π΄Π²Π° UI ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°: UITextField Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° Π³ΠΎΡΠΎΠ΄Π° ΠΈ UILabel Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ. Π ViewController Ρ Π½Π°Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π±ΡΠ΄ΡΡ Outlet Π΄Π»Ρ ΡΡΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²:
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ Π² viewDidLoad ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Β«ΡΡΡΠ½ΡΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΡΒ» Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ binding () :
ΠΠ° ΡΡΠΎΠΌ Π²ΡΡ. ΠΠΎΠ΄ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° Github.
ΠΠΎΡΠΎΠ²ΠΈΠΌΡΡ ΠΊ Combine
ΠΠΎΠ»ΡΠΎΡΠ° Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄ Ρ ΠΏΠ΅Π» Π΄ΠΈΡΠΈΡΠ°ΠΌΠ±Ρ RxSwift. Π£ ΠΌΠ΅Π½Ρ ΡΡΠ»ΠΎ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² Π½Π΅ΠΌ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ, ΠΏΡΡΠΈ Π½Π°Π·Π°Π΄ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ. Π’Π΅ΠΏΠ΅ΡΡ Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ» ΡΠ°ΠΌΡΠΉ Π»ΡΡΡΠΈΠΉ ΠΌΠΎΠ»ΠΎΡΠΎΠΊ Π² ΠΌΠΈΡΠ΅, ΠΈ Π±ΡΠ΄Ρ Ρ ΠΏΡΠΎΠΊΠ»ΡΡ, Π΅ΡΠ»ΠΈ Π²ΡΡ Π²ΠΎΠΊΡΡΠ³ Π½Π΅ ΠΊΠ°Π·Π°Π»ΠΎΡΡ ΠΌΠ½Π΅ Π³Π²ΠΎΠ·Π΄ΡΠΌ.
ΠΠ° Π»Π΅ΡΠ½Π΅ΠΉ ΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈ WWDC Apple ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ»Π° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Combine. ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, ΠΎΠ½ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΠ°ΠΊ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ Π»ΡΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ RxSwift. ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Ρ ΡΠΌΠΎΠ³Ρ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ, ΡΡΠΎ ΠΌΠ½Π΅ Π² Π½ΡΠΌ Π½ΡΠ°Π²ΠΈΡΡΡ, Π° ΡΡΠΎ Π½Π΅Ρ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΡΠΈΠ·Π²Π°Π½ ΡΠ΅ΡΠΈΡΡ Combine.
Π Π΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅? Π ΡΡΠΎ?
Π‘ΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ ReactiveX β ΡΠ°ΡΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ RxSwift β ΠΎΠ±ΡΡΡΠ½ΡΠ΅Ρ Π΅Π³ΠΎ ΡΡΡΡ ΡΠ°ΠΊ:
API Π΄Π»Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ.
ReactiveX β ΡΡΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π»ΡΡΡΠΈΡ ΠΈΠ΄Π΅ΠΉ ΠΈΠ· ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Β«Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΡΒ» (Observer) ΠΈ Β«ΠΈΡΠ΅ΡΠ°ΡΠΎΡΒ» (Iterator), Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Π ΡΡΠΎ Π²ΡΠ΅ ΠΆΠ΅ ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ?
ΠΡΠ½ΠΎΠ²Ρ
Π§ΡΠΎΠ±Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ ΡΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Ρ ΡΡΠΈΡΠ°Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ, ΠΊΠ°ΠΊ ΠΌΡ ΠΊ Π½Π΅ΠΌΡ ΠΏΡΠΈΡΠ»ΠΈ. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΠΎΠΏΠΈΡΡ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠΈΠΏΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΠΠΠ-ΡΠ·ΡΠΊΠ΅, ΠΏΠΎΠΊΡΡΡΠΈΡΡ ΠΈΡ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΉΡΠΈ ΠΊ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Π ΡΡΠΎΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π΅ ΠΌΡ Π±ΡΡΡΡΠΎ ΡΠ³Π»ΡΠ±ΠΈΠΌΡΡ Π² Π΄Π΅Π±ΡΠΈ, ΡΡΠΎ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ΄Π½Π°ΠΊΠΎ Ρ ΡΡΠΈΡΠ°Ρ ΡΡΠΎ Π»ΡΠ±ΠΎΠΏΡΡΠ½ΡΠΌ Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ΠΌ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ·ΡΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π²Π΅ΡΡΠΈ Π½Π°Ρ ΠΊ Π½ΠΎΠ²ΡΠΌ ΠΎΡΠΊΡΡΡΠΈΡΠΌ.
Π’Π°ΠΊ ΡΡΠΎ ΠΆΠ΄ΠΈΡΠ΅ ΠΌΠΎΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π±ΡΠ΄ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Ρ Π½ΠΎΠ²ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ.
Enumerable
ΠΠ·Π²Π΅ΡΡΠ½ΠΎΠ΅ ΠΌΠ½Π΅ Β«ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅Β» Π·Π°ΡΠΎΠ΄ΠΈΠ»ΠΎΡΡ Π² ΡΠ·ΡΠΊΠ΅, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ ΠΊΠΎΠ³Π΄Π°-ΡΠΎ ΠΏΠΈΡΠ°Π» β C#. ΠΡΠ΅Π΄ΠΏΠΎΡΡΠ»ΠΊΠ° ΡΠ°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°:
Π§ΡΠΎ Π΅ΡΠ»ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· enumerable, ΡΠ΅ ΡΠ°ΠΌΠΈ Π±ΡΠ΄ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π²Π°ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ?
ΠΡΡ ΠΈΠ΄Π΅Ρ, Β«push Π²ΠΌΠ΅ΡΡΠΎ pullΒ», Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΎΠΏΠΈΡΠ°Π»ΠΈ ΠΡΠ°ΠΉΠ°Π½ ΠΠ΅ΠΊΠΌΠ°Π½ ΠΈ ΠΡΠΈΠΊ ΠΠ΅ΠΉΠ΅Ρ. ΠΠ΅ΡΠ²ΡΠ΅ 36 ΠΌΠΈΠ½ΡΡβ¦ Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ½ΡΠ», Π½ΠΎ Π½Π°ΡΠΈΠ½Π°Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Ρ 36-ΠΉ ΠΌΠΈΠ½ΡΡΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ.
ΠΠΎΡΠΎΡΠ΅, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΎΡΠΌΡΠ»ΠΈΡΡΠ΅ΠΌ ΠΈΠ΄Π΅Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² Swift, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎ ΡΡΠΎΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅. Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΠΈΡ ΡΠ΅ΠΉΠΊΠΎΠ²ΡΡ Swift-ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ²:
ΠΠ²ΠΎΠΉΠ½ΠΈΠΊΠΈ
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΡ ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΠ½ΡΠΌ ΠΈ ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠΎΠ². ΠΡΠ΄Π΅ΠΌ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΡΠ΄Π°, ΠΎΡΠΊΡΠ΄Π° ΠΎΠ½ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΈ. Π ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡΡΡΠ΄Π°, ΠΎΡΠΊΡΠ΄Π° ΠΎΠ½ΠΈ ΡΡ ΠΎΠ΄ΠΈΠ»ΠΈ. ΠΠ²ΡΡΠΈΡ Π°Π±ΡΡΡΠ΄Π½ΠΎ, Π½ΠΎ ΠΏΠΎΡΠ΅ΡΠΏΠΈΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ.
ΠΠ²ΠΎΠΉΠ½ΠΈΠΊ Enumerable
ΠΠ°ΡΠ½ΡΠΌ Ρ Enumerable:
ΠΠ½Π°Ρ, ΡΡΠΎ ΡΡΡΠ°Π½Π½ΠΎ. ΠΠ΅ ΡΡ ΠΎΠ΄ΠΈΡΠ΅.
ΠΠ²ΠΎΠΉΠ½ΠΈΠΊ Enumerator
ΠΠ΄Π΅ΡΡ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ:
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π΅ΡΡ ΠΊΠΎΠ΅-ΡΡΠΎ: Π²Π·Π³Π»ΡΠ½ΠΈΡΠ΅ Π½Π° ΡΠΈΠ³Π½Π°ΡΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ°:
ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈcΡ ΠΎΠ΄ΠΈΡΡ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅:
Π ΡΠ΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ Π²ΡΡ ΡΠΏΡΠΎΡΡΠΈΠΌ ΠΈ Π±ΡΠ΄Π΅ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡ enumeratorIsDone Π»ΠΈΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π°β¦ Π²ΡΡ Π±ΡΠ΄Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π³ΠΎΡΠΎΠ²ΠΎ. Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΡΡΡΡ ΡΡΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ, ΡΠΏΡΠΎΡΡΠΈΠΌ ΠΊΠΎΠ΄:
ΠΡΠΈΠ±Π΅ΡΡΠΌΡΡ Π·Π° ΡΠΎΠ±ΠΎΠΉ
ΠΠΎΠΌΠ΅ΡΡΠΈΠΌ DualOfEnumerator ΡΡΠ΄Π°:
ΠΠΎΡ ΠΊΠ°ΠΊΠΎΠΉ Π΄Π²ΠΎΠΉΠ½ΠΈΠΊ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ Π² ΠΈΡΠΎΠ³Π΅:
Π₯ΠΎΡΡ ΡΠΎΠ·ΠΎΠΉ Π½Π°Π·ΠΎΠ²ΠΈ, Ρ ΠΎΡΡ Π½Π΅Ρ
ΠΡΠ°ΠΊ, Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, Π²ΠΎΡ ΡΡΠΎ Ρ Π½Π°Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ:
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΈΠ³ΡΠ°Π΅ΠΌΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.
Π’Π°ΠΊ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π»ΡΡΡΠ΅ ΠΈ ΠΏΠΎΠ½ΡΡΠ½Π΅Π΅.
Π ΡΡΠΎ Π½Π°ΡΡΡΡ ΠΈΠΌΡΠ½ ΡΠΈΠΏΠΎΠ²? ΠΠ½ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠΆΠ°ΡΠ½Ρ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ.
Π£Ρ ΡΡ
ΠΡΠΈ Π΄Π²Π° ΡΠΈΠΏΠ° Π»Π΅ΠΆΠ°Ρ Π² ΠΎΡΠ½ΠΎΠ²Π΅ RxSwift ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ°ΡΡΡΡ Β«ΡΠ΅ΠΉΠΊΠΎΠ²ΡΡ Β» ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ²
Π£ΠΏΠΎΠΌΡΠ½ΡΡΡΠ΅ ΠΌΠ½ΠΎΠΉ Π²ΡΡΠ΅ Π΄Π²Π° Β«ΡΠ΅ΠΉΠΊΠΎΠ²ΡΡ Β» ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π²ΠΎΠ²ΡΠ΅ Π½Π΅ ΡΠ΅ΠΉΠΊΠΎΠ²ΡΠ΅. ΠΡΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠΈΠΏΠΎΠ² Π² Swift:
Π’Π°ΠΊ ΠΎ ΡΡΠΌ Π²ΠΎΠ»Π½ΠΎΠ²Π°ΡΡΡΡ?
Π’Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ β ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ β ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΡΡΡΡ. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π½Π°ΠΆΠ°Π» Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π²ΡΠ±ΡΠ°Π» Π²ΠΊΠ»Π°Π΄ΠΊΡ Π² UISegmentControl. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π²ΡΠ±ΡΠ°Π» Π²ΠΊΠ»Π°Π΄ΠΊΡ Π² UITabBar. ΠΠ΅Π±-ΡΠΎΠΊΠ΅Ρ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π΄Π°Π» Π½Π°ΠΌ Π½ΠΎΠ²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΡΠΎ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ β ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ-ΡΠΎ β Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΎΡΡ. ΠΡΠ° ΡΠΎΠ½ΠΎΠ²Π°Ρ Π·Π°Π΄Π°ΡΠ° Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΠ»Π°ΡΡ. ΠΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π΄ΠΎ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΡΡΠΈ.
Π ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΠΌΠΈΡΠ΅ CocoaTouch Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ:
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, Π΅ΡΠ»ΠΈ Π±ΡΠ» Π±Ρ ΡΠ΅Π»ΡΠΉ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΈΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ, ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ElementβΠΎΠ², ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ.
ΠΠ½Π΅Π·Π°ΠΏΠ½ΠΎ Π² Π½Π°ΡΠΈΡ
ΡΡΠΊΠ°Ρ
ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ².
Π Π²ΠΎΡ, ΠΌΡ Π²Π΅ΡΠ½ΡΠ»ΠΈΡΡ ΠΊ Π½Π°ΡΠ°Π»Ρ:
API Π΄Π»Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ.
ΠΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ RxSwift ΡΠ°ΠΊΠΈΠΌ ΠΌΠΎΡΠ½ΡΠΌ ΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ. ΠΠ°ΠΊ ΠΈ Combine.
Π§ΡΠΎ Π΄Π°Π»ΡΡΠ΅?
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΎΠ± RxSwift Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅, ΡΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΌΠΎΠΈ ΠΏΡΡΡ ΡΡΠ°ΡΠ΅ΠΉ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² 2016-ΠΌ. Π Π½ΠΈΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅Π³ΠΎ CocoaTouch-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΏΠΎΡΡΠ°ΠΏΠ½ΡΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² RxSwift.
Π ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΠ°ΡΠ΅ΠΉ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π² ΠΌΠΎΡΠΌ ΡΠΈΠΊΠ»Π΅ ΡΡΠ°ΡΠ΅ΠΉ Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ , Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΡ Π² Combine, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ°Π²Π½Ρ Combine Ρ RxSwift.
Combine: Π² ΡΡΠΌ ΡΡΡΡ?
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Combine ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ°Π·Π»ΠΈΡΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌ ΠΈ RxSwift. ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΠΈΡ ΡΡΠΈ:
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ RxCocoa
Π ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΠΎΡΡΠΎΠ² Ρ Π³ΠΎΠ²ΠΎΡΠΈΠ», ΡΡΠΎ RxSwift Π½Π΅ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅Π΅, ΡΠ΅ΠΌβ¦ RxSwift. ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΎΠ² ΠΈΠ· UIKit Π² ΡΠΈΠΏΠ°-Π½ΠΎ-Π½Π΅-ΡΠΎΠ²ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΡΠΎΠ΅ΠΊΡΠ΅ RxCocoa. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, RxSwiftCommunity ΠΏΠΎΡΠ»ΠΈ Π΄Π°Π»ΡΡΠ΅ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ²ΡΠ·ΠΎΠΊ Π΄Π»Ρ Π΅ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΊΡΠΎΠΌΠ½ΡΡ Π·Π°ΠΊΠΎΡΠ»ΠΊΠΎΠ² UIKit, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ CocoaTouch, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ RxSwift ΠΈ RxCocoa.
ΠΠΎΡΡΠΎΠΌΡ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Observable ΠΏΠΎΡΠΎΠΊ ΠΈΠ·, ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π½Π°ΠΆΠ°ΡΠΈΡ Π½Π° UIButton. ΠΡΠ΅ ΡΠ°Π· ΠΏΡΠΈΠ²Π΅Π΄Ρ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ°Π²Π°ΠΉΡΠ΅ (Π½Π°ΠΊΠΎΠ½Π΅Ρ-ΡΠΎ) Π²ΡΠ΅ ΠΆΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ Combine
Combine ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆ Π½Π° RxSwift. ΠΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Combine ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠΉ Swift API Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠ²ΡΡΠΈΡ Π·Π½Π°ΠΊΠΎΠΌΠΎ: Π²ΡΠΏΠΎΠΌΠ½ΠΈΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ReactiveX (ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΄Π»Ρ RxSwift):
API Π΄Π»Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ.
Π ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅. ΠΡΠΎΡΡΠΎ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ReactiveX ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Ρ. ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊ:
API Π΄Π»Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎ ΠΌΠ½Π΅.
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ ΡΠ°Π½ΡΡΠ΅
ΠΠΎΠ³Π΄Π° Ρ Π½Π°ΡΠ°Π» Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ API, ΡΠΎ ΡΡΠ°Π»ΠΎ ΡΡΠ°Π·Ρ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΌΠ½Π΅ ΡΠΈΠΏΠΎΠ² ΠΈΠ· RxSwift ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΡ ΠΎΠΆΠΈΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ Π² Combine:
Β«ΠΠ΅ΡΠ΅ΡΡΠ² Π½Π° ΠΊΠ°ΠΊΠ°Π²ΡΡΠΊΡΒ»
ΠΡΡ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡ ΡΠ³Π»ΡΠ±Π»ΡΡΡΡΡ Π² RxCocoa. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ Π²ΡΡΠ΅ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ Ρ ΠΎΡΠ΅Π»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ Observable, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°ΠΆΠ°ΡΠΈΡ Π½Π° UIButton? ΠΠΎΡ ΠΎΠ½:
Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π² Combine, ΡΡΠ΅Π±ΡΠ΅ΡΡΡβ¦ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ.
Combine Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΏΠΎ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ΅ ΠΊ UIKit-ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ.
ΠΡΠΎβ¦ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±Π»ΠΎΠΌ.
ΠΠΎΡ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ UIControl.Event ΠΈΠ· UIControl Ρ ΠΏΠΎΠΌΠΎΡΡΡ Combine:
Π’ΡΡβ¦ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ. Π₯ΠΎΡΡ Π±Ρ Π²ΡΠ·ΠΎΠ² Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠ΅:
ΠΠ»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ, RxCocoa ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΈΡΡΠ½ΠΎΠ΅, Π²ΠΊΡΡΠ½ΠΎΠ΅ ΠΊΠ°ΠΊΠ°ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΏΡΠΈΠ²ΡΠ·ΠΎΠΊ ΠΊ UIKit-ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ:
ΠΠ»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ, ΠΌΠΎΠΉ ControlPublisher ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΡΠΎΠ»ΡΠΊΠΎβ¦ ΡΠ΅ΠΉΡΠ°Ρ. Π’ΠΎΠ»ΡΠΊΠΎ ΠΈΠ·-Π·Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² (Π½ΠΎΠ»Ρ) ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠ΅ (ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½ΠΎΠ»Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ RxCocoa) ΠΌΠΎΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΎΠΏΠ°ΡΠ½Π΅Π΅.
ΠΠΎΠΌΠΎΡΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°?
Π§Π΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Ρ Π½ΠΈΡΡΠΎ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΉ open source Β«CombineCocoaΒ», ΠΊΠΎΡΠΎΡΡΠΉ Π±Ρ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ» ΠΏΡΠΎΠ±Π΅Π» RxCocoa ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π»ΠΎ RxSwiftCommunity.
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ ΡΡΠΈΡΠ°Ρ ΡΡΠΎ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΌ ΠΌΠΈΠ½ΡΡΠΎΠΌ Combine. Π― Π½Π΅ Ρ ΠΎΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ Π²Π΅ΡΡ RxCocoa, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ UIKit-ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ.
ΠΡΠ»ΠΈ Ρ ΡΠ΅ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠ°Π²ΠΊΡ Π½Π° SwiftUI, ΡΠΎ, ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΠΏΡΠΈΠ²ΡΠ·ΠΎΠΊ. ΠΠ°ΠΆΠ΅ ΠΌΠΎΡ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΡΡΡ UI-ΠΊΠΎΠ΄Π°. ΠΡΠΊΠΈΠ½ΡΡΡ Π²ΡΡ ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΠ³Π½ΡΡΡ Π½Π° ΠΏΠΎΠ΅Π·Π΄ Combine, Π±ΡΠ΄Π΅Ρ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π³Π»ΡΠΏΠΎ, Π° ΡΠΎ ΠΈ ΠΎΠΏΠ°ΡΠ½ΠΎ.
Π ΡΠ»ΠΎΠ²Ρ, Π² ΡΡΠ°ΡΡΠ΅ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Receiving and Handling Events with Combine ΠΊΡΠ°ΡΠΊΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Π² Combine. ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ ΠΎΡΠΎΡΠ΅Π΅, Π² Π½Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π΅Π³ΠΎ Π² ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΠ°ΠΊΠΆΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
ΠΡΠΈΠΌΠ΅Ρ
ΠΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ Π² ΠΊΠΎΠ½Π΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π³Π΄Π΅ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°:
Π‘ ΡΡΠΈΠΌ Ρ ΠΌΠ΅Π½Ρβ¦ ΠΊΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
Π£Π²Π΅Π΄ΠΎΠΌΠ»ΡΡ Π²Π°Ρ, ΡΡΠΎ ΠΌΠ½Π΅ ΡΡΠΎ Π½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ
ΠΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π²ΠΎΠΏΡΠΎΡΠΎΠ² Ρ ΠΌΠ΅Π½Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π΅ ΡΡΡΠΎΠΊΠΈ:
NotificationCenter β ΡΡΠΎ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΡΠΈΠ½Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΡΠΈΠ½Ρ), Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π±ΡΠΎΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΈΠ»ΠΈ ΠΏΠΎΠΉΠΌΠ°ΡΡ ΠΊΡΡΠΎΡΠΊΠΈ ΠΏΡΠΎΠ»Π΅ΡΠ°ΡΡΠ΅ΠΉ ΠΌΠΈΠΌΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. ΠΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ Π²ΡΡ-ΠΈ-Π΄Π»Ρ-Π²ΡΠ΅Ρ , ΠΊΠ°ΠΊ ΠΈ Π±ΡΠ»ΠΎ Π·Π°Π΄ΡΠΌΠ°Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»ΡΠΌΠΈ. Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ·Π½Π°ΡΡ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, ΡΡΠΎ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ° Π±ΡΠ»Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΈΠ»ΠΈ ΡΠΊΡΡΡΠ°. NotificationCenter β ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ NotificationCenter β ΡΡΠΎ ΠΊΠΎΠ΄ Ρ Π΄ΡΡΠΊΠΎΠΌ. ΠΡΠ²Π°ΡΡ ΡΠ»ΡΡΠ°ΠΈ (Π²ΡΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΏΡΠΎ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ), ΠΊΠΎΠ³Π΄Π° NotificationCenter Π² ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΡΡΡΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ°ΡΡΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ NotificationCenter β ΡΠ°ΠΌΠΎΠ΅ ΡΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ Π·Π°ΠΊΠΈΠ½ΡΡΡ ΡΡΠΎ-ΡΠΎ Π² NotificationCenter ΠΈ Π·Π°Π±ΡΠ°ΡΡ ΡΡΠΎ ΡΡΠΎ-ΡΠΎ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, NotificationCenter Β«ΡΡΡΠΎΠΊΠΎΒ»-ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½, ΡΠΎ Π΅ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠΏΡΡΡΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΠΊΠ°ΠΊΠΎΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΡΡΠ°Π΅ΡΡΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΡΠ»ΡΡΠ°ΡΡ. Swift Π΄Π΅Π»Π°Π΅Ρ Π²ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅, ΡΡΠΎΠ±Ρ ΡΠ»ΡΡΡΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, Π½ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΊΡΠΎΠ΅ΡΡΡ Π²ΡΠ΅ ΡΠΎΡ ΠΆΠ΅ NSString.
ΠΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ KVO
ΠΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ Apple ΡΠΆΠ΅ Π΄Π°Π²Π½ΠΎ Π΅ΡΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ Π² ΡΠ°Π·Π½ΡΡ ΡΠ°ΡΡΡΡ ΠΊΠΎΠ΄Π°: key-value observation (KVO). Apple ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΡΠ°ΠΊ:
ΠΡΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ Π² Π·Π°Π΄Π°Π½Π½ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°Ρ Π΄ΡΡΠ³ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ²ΠΈΡΡ Gui Rambo Ρ Π·Π°ΠΌΠ΅ΡΠΈΠ», ΡΡΠΎ Apple Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° Π² Combine ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ KVO. ΠΡΠΎ ΠΌΠΎΠ³Π»ΠΎ ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ Ρ ΡΠΌΠΎΠ³Ρ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΎΠ³ΠΎΡΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ Π² Combine Π°Π½Π°Π»ΠΎΠ³Π° RxCocoa. ΠΡΠ»ΠΈ Ρ ΡΠΌΠΎΠ³Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ KVO, ΡΡΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΡΡΠ°Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π² Β«CombineCocoaΒ», Π΅ΡΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊ Π²ΡΡΠ°Π·ΠΈΡΡΡΡ.
ΠΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΠΎΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ KVO Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· UITextField ΠΈ Π²ΡΠ²ΠΎΠ΄Π° Π΅Π³ΠΎ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ:
ΠΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ, ΠΈΠ΄Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅?
ΠΠ΅ ΡΠ°ΠΊ Π±ΡΡΡΡΠΎ, Π΄ΡΡΠ·ΡΡ.
UIKit, ΠΏΠΎ Π±ΠΎΠ»ΡΡΠΎΠΌΡ ΡΡΡΡΡ, Π½Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ KVO.
Π Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ KVO ΠΌΠΎΡ ΠΈΠ΄Π΅Ρ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΠ»ΠΈ: ΠΊΠΎΠ΄ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ, ΠΊΠΎΠ³Π΄Π° Ρ Π²Π²ΠΎΠΆΡ ΡΠ΅ΠΊΡΡ Π² ΠΏΠΎΠ»Π΅.
ΠΡΠ°ΠΊ, ΠΌΠΎΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Ρ Π½Π° ΠΈΠ·Π±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ Π² UIKit-ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ°Ρ Π±ΡΠ»ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Ρ, Π½ΠΎ Π½Π΅Π΄ΠΎΠ»Π³ΠΈ.
ΠΡΠΈΡΡΠΊΠ°
ΠΡΡΠ³Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Combine Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎΠΊΠ° ΡΡΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅ΡΡΠ½ΠΎ, Π³Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ ΡΠ΅ΡΡΡΡΡ Π² Cancellable ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ . ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Ρ ΡΠ°Π½ΠΈΡΡ ΠΈΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°. ΠΠΎ Π½Π΅ ΠΏΡΠΈΠΏΠΎΠΌΠΈΠ½Π°Ρ, ΡΡΠΎΠ±Ρ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΡΡΠΎ-ΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ ΠΎΠ± ΠΎΡΠΈΡΡΠΊΠ΅.
Π RxSwift Π΅ΡΡΡ ΡΠΆΠ°ΡΠ½ΠΎ-Π½Π°Π·Π²Π°Π½Π½ΡΠΉ-Π½ΠΎ-Π½Π΅Π²Π΅ΡΠΎΡΡΠ½ΠΎ-ΡΠ΄ΠΎΠ±Π½ΡΠΉ DisposeBag. Π Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π»Π΅Π³ΠΊΠΎ ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ CancelBag Π² Combine, Π½ΠΎ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ²Π΅ΡΠ΅Π½ Π² ΡΠΎΠΌ, ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΡΠ°ΠΌΠΎΠ΅ Π»ΡΡΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎΠ± ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ Π² RxSwift ΠΈ Combine, ΠΎ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π°Ρ ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠ°Ρ ΠΎΠ±ΠΎΠΈΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ².
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ HTTP Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² Swift 5 Ρ ΠΏΠΎΠΌΠΎΡΡΡ Combine ΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΡ Π² SwiftUI. Π§Π°ΡΡΡ 1
ΠΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ Π² Swift 5 Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Combine Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌΠΈ URLSession ΠΈ Codable ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²Π°ΠΌ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΎΡΠ΅Π½Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ°.
ΠΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π° ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π²Ρ Π·Π°Π΄Π°Π»ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ API-key ΠΈΠ»ΠΈ ΠΏΡΠ΅Π²ΡΡΠΈΠ»ΠΈ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈΠ»ΠΈ Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΈΠ½Π°ΡΠ΅ Π²Ρ ΡΠΈΡΠΊΡΠ΅ΡΠ΅ ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΏΠΎΠ»Π½ΠΎΠΌ Π½Π΅Π΄ΠΎΡΠΌΠ΅Π½ΠΈΠΈ Ρ ΠΏΡΡΡΡΠΌ ΡΠΊΡΠ°Π½ΠΎΠΌ. ΠΠΎΡΡΠΎΠΌΡ Π½Π°Π΄ΠΎ ΡΠΌΠ΅ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ±ΠΈΡΠ°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Combine Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ°, Π½ΠΎ ΠΈ ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠΊΠ΅, ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΡ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π° ΡΠΊΡΠ°Π½Π΅.
ΠΠΎΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° Github.
ΠΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ ΠΈ API ΡΠ΅ΡΠ²ΠΈΡΠ° NewsAPI.org
Π’ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΠ°ΡΡΠΈ ΠΈΠ»ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π²ΡΠ±ΠΈΡΠ°ΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° NewsAPI.org, Π±ΡΠ΄Π΅ΠΌ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ enum Endpoint:
ΠΠ½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π°ΠΌ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» AnyPublisher ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π² Π²ΠΈΠ΄Π΅ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ [Source] ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ Never (Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΎΠΊ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΏΡΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² [ ] ).
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ Π΄Π²Π° ΠΌΠ΅ΡΠΎΠ΄Π°:
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌΡΡ Π½Π° ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π°ΡΡ ΠΠΎΠ΄Π΅Π»Ρ Π΄Π»Ρ SwiftUI Π²Π½Π΅ΡΠ½ΠΈΠΌ Β«ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ ΠΈΡΡΠΈΠ½ΡΒ» (source of truth).
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π² SwiftUI Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΠΈΒ» Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π° ΡΡΠ°ΡΠ΅ΠΉ:
ΠΠ°ΠΊ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ?
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π² Combine ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ flatMap :
ΠΠ°Π»Π΅Π΅ ΠΌΡ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡΒ» Π½Π° ΡΡΠΎΠ³ΠΎ Π²Π½ΠΎΠ²Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°Β» assign (to: \.articles, on: self) ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΎΡ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ @Published ΠΌΠ°ΡΡΠΈΠ²Ρ articles :
ΠΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π² init( ) ΠΠ‘ΠΠΠ₯Π ΠΠΠΠΠΠ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» ΠΈ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π»ΠΈΡΡΒ» Π½Π° Π½Π΅Π³ΠΎ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ² AnyCancellable Β«ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡΒ» ΠΈ ΡΡΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΠΈΠΌ Π½Π°ΡΡ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡΒ» Π² ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ΅ let subscription :
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΌΠ°ΡΡΠΈΠ²Ρ ΡΡΠ°ΡΠ΅ΠΉ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΡΠ΅Ρ ΠΎΠΏΡΠΈΠΉ β Β«topHeadLinesΒ», Β«searchΒ» ΠΈ Β«from categoryΒ»:
. Π½ΠΎ Π΄Π»Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ searchString = «sports» (ΡΠ°ΠΌ, Π³Π΄Π΅ ΠΎΠ½Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ):
ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΈ «search» Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ SearchView Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ:
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΊΠ°ΡΡ Π»ΡΠ±ΡΠ΅ Π½ΠΎΠ²ΠΎΡΡΠΈ ΠΏΠΎ Π½Π°Π±ΡΠ°Π½Π½ΠΎΠΉ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅:
ΠΠ»Ρ ΠΎΠΏΡΠΈΠΈ «from category» Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠ±ΡΠ°ΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ ΠΌΡ Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ science :
ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°Ρ ObservableObject ΠΠΎΠ΄Π΅Π»Ρ, ΠΈΠΌΠ΅ΡΡΠ°Ρ Π΄Π²Π° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ @Published ΡΠ²ΠΎΠΉΡΡΠ²Π° β indexEndpoint ΠΈ searchString β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ±ΡΠ°ΡΡ ΡΠΈΡΠΎΠΊΠΈΠΉ ΡΠΏΠ΅ΠΊΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Ρ ΡΠ°ΠΉΡΠ° NewsAPI.org.
Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΡΠ°Π½:
β¦ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΈΡ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ:
β¦ Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ΅: Π΅Π³ΠΎ ΠΈΠΌΡ, ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ, ΡΡΡΠ°Π½Ρ, ΠΊΡΠ°ΡΠΊΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠ°ΠΉΡ:
ΠΡΠ»ΠΈ ΠΊΠ»ΠΈΠΊΠ½ΡΡΡ Π½Π° ΡΡΡΠ»ΠΊΠ΅, ΡΠΎ ΠΏΠΎΠΏΠ°Π΄Π΅ΠΌ Π½Π° ΡΠ°ΠΉΡ ΡΡΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π½ΡΠΆΠ½Π° ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°Ρ ObservableObject ΠΠΎΠ΄Π΅Π»Ρ, ΠΈΠΌΠ΅ΡΡΠ°Ρ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ @Published ΡΠ²ΠΎΠΉΡΡΠ² β searchString ΠΈ country :
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½ΡΠΆΠ½ΠΎΠ΅ Π½Π°ΠΌ View :
ΠΠΎΠΎΠ±ΡΠ΅, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° Π²ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ NewsApp, ΡΠΎ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΌΡ ΡΠ²Π½ΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π»ΠΈ Π²ΡΠ±ΠΎΡΠΊΡ ΡΡΠ°ΡΠ΅ΠΉ ΠΈΠ»ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Ρ ΡΠ°ΠΉΡΠ° NewsAPI.org. ΠΡ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ @Published Π΄Π°Π½Π½ΡΠΌΠΈ, Π° View Model Π΄Π΅Π»Π°Π΅Ρ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ: Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ ΡΡΠ°ΡΡΠΈ ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
ΠΠΎΠ΄Π΅Π»Ρ ΡΡΠ°ΡΡΠΈ Article ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ URL ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π°ΡΡΠ΅Π³ΠΎ Π΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ urlToImage :
ΠΠ° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ URL ΠΌΡ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°ΠΌΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ UIImage Ρ ΡΠ°ΠΉΡΠ° NewsAPI.org.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ flatMap ΠΈ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°Β» assign (to: \image, on: self) Ρ ΡΠ΅Π»ΡΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Ρ @Published image :
Β«ΠΠ·Π΄Π°ΡΠ΅Π»ΡΒ» AnyPublisher Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ url ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π² ΡΡΠ½ΠΊΡΠΈΠΈ fetchImageErr (for url: URL?) :
ΠΠ°Π»Π΅Π΅ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π³ΠΈ, ΡΡΠΈΡΡΠ²Π°Ρ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ (ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½Π°ΠΌ ΠΏΡΠΎΡΡΠΎ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° Π΅ΡΡΡ):
ΠΠ°ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠΊ ΠΌΡ ΡΠΏΠ°ΠΊΡΠ΅ΠΌ Π²ΡΠ΅ Π½Π°ΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎΠΊΠ°Π·Π° Π΄Π°Π½Π½ΡΡ Ρ Π°Π³ΡΠ΅Π³Π°ΡΠΎΡΠ° Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ NewsAPI.org Π² TabView :
ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠΊΠ΅ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ JSON Π΄Π°Π½Π½ΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° NewsAPI.org.
ΠΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ NewsAPI.org ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π²Ρ Π·Π°Π΄Π°Π»ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ API-key ΠΈΠ»ΠΈ, ΠΈΠΌΠ΅Ρ ΡΠ°ΡΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΡΠΎΠΈΡ, ΠΏΡΠ΅Π²ΡΡΠΈΠ»ΠΈ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈΠ»ΠΈ Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ. ΠΡΠΈ ΡΡΠΎΠΌ ΡΠ΅ΡΠ²Π΅Ρ NewsAPI.org ΡΠ½Π°Π±ΠΆΠ°Π΅Ρ Π²Π°Ρ HTTP ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ:
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ½Π°ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²Π΄ΡΡΠ³ Π½ΠΈ Ρ ΡΠΎΠ³ΠΎ, Π½ΠΈ Ρ ΡΠ΅Π³ΠΎ, ΡΠ΅ΡΠ²Π΅Ρ NewsAPI.org ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΡΠΎΡΡ, ΠΎΡΡΠ°Π²Π»ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΏΠΎΠ»Π½ΠΎΠΌ Π½Π΅Π΄ΠΎΡΠΌΠ΅Π½ΠΈΠΈ Ρ ΠΏΡΡΡΡΠΌ ΡΠΊΡΠ°Π½ΠΎΠΌ.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π’ΠΠ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ°Π²Π½ΡΠΉ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΌΡ NewsError :
Π Π΅ΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠΊΠ°Π· ΡΠΊΡΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Alert Π΄Π»Ρ ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π½Π΅Π²Π΅ΡΠ½ΡΠΉ API ΠΊΠ»ΡΡ:
β¦ ΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅:
ΠΡΠ»ΠΈ Π»ΠΈΠΌΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈΡΡΠ΅ΡΠΏΠ°Π½, ΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅:
ΠΠ°ΠΊ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎΡ ΠΊΠΎΠ΄ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ», Π΅ΡΠ»ΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ Π΄Π»Ρ url ΡΠ²Π»ΡΠ΅ΡΡΡ Endpoint Π΄Π»Ρ Π°Π³ΡΠ΅Π³Π°ΡΠΎΡΠ° Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ NewsAPI.org ΠΈΠ»ΠΈ ΡΡΡΠ°Π½Π° country ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, Π° Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΠΎΠ΄Π΅Π»ΠΈ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠΈΡΠΎΠΊ ΡΡΠ°ΡΠ΅ΠΉ ΠΈΠ»ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ:
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠΎ ΠΊΠΎΠ΄ Π΄Π»Ρ Generic Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ»ΠΎΠΆΠ½ΠΈΡΡΡ, Π½ΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΊΠΎΠ΄ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ callbacks:
ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π²ΡΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΠΈΒ» ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ Β«Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΒ» Π² ObservableObject ΠΊΠ»Π°ΡΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ²ΠΎΠΈΡ @Published ΡΠ²ΠΎΠΉΡΡΠ² ΡΠΏΡΠ°Π²Π»ΡΡΡ Π²Π°ΡΠΈΠΌ UI, ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ SwiftUI. ΠΡΠΈ ΠΊΠ»Π°ΡΡΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΠ³ΡΠ°ΡΡ ΡΠΎΠ»Ρ View Model, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² Π½ΠΈΡ Π΅ΡΡΡ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ Β«Π²Ρ ΠΎΠ΄Π½ΡΠ΅Β» @Published ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π°ΠΊΡΠΈΠ²Π½ΡΠΌ UI ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ (ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ ΠΏΠΎΠ»ΡΠΌ TextField, Stepper, Picker, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ Toggle ΠΈ Ρ.Π΄.) ΠΈ Β«Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅Β» @Published ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΡΠΎΡΡΠΎΡΡΠΈΠ΅ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΈΠ· ΠΏΠ°ΡΡΠΈΠ²Π½ΡΡ UI ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² (ΡΠ΅ΠΊΡΡΠΎΠ² Text, ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Image, Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΈΠ³ΡΡ Circle(), Rectangle() ΠΈ Ρ.Π΄.
ΠΡΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ ΠΏΡΠΎΠ½ΠΈΠ·Π°Π½ΠΎ Π²ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π°Π³ΡΠ΅Π³Π°ΡΠΎΡΠΎΠΌ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ NewsAPI.org, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ Π² ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅. ΠΠ½Π° ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π°ΡΡ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΡΠΈΠ»ΡΠΌΠΎΠ² TMDb ΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠΎΡΠ° Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ Hacker News, ΠΎ ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΠ°ΡΡΡΡ .
ΠΠΎΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° Github.
1. Π₯ΠΎΡΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π°ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ΡΡ ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠΎΠΌ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅, ΡΠΎ Π·Π½Π°ΠΉ, ΡΡΠΎ NavigationLink Π½Π° ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ NavigationLink Π½Π° ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ 1 ΡΠ°Π·. Π’.Π΅. Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΡΡΠ»ΠΊΡ, Π²Π΅ΡΠ½ΡΠ»ΠΈΡΡ Π½Π°Π·Π°Π΄, ΠΊΠ»ΠΈΠΊΠ°Π΅ΡΠ΅ Π½Π° ΡΡ ΠΆΠ΅ ΡΡΡΠ»ΠΊΡ β ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. ΠΠΎ ΡΠ΅Ρ ΠΏΠΎΡ ΠΏΠΎΠΊΠ° Π²Ρ Π½Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΡΠ»ΠΊΠΎΠΉ, ΠΏΠ΅ΡΠ²Π°Ρ Π½Π΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π·Π°ΡΠΎ Π²ΡΠΎΡΠ°Ρ ΡΡΠ°Π½Π΅Ρ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ. ΠΠΎ ΡΠ°ΠΊΠΎΠ΅ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠ΅, Π½Π° ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ.
2. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ http Π²ΠΌΠ΅ΡΡΠΎ https Π΄Π»Ρ Β«ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊΒ» ΡΠ²ΠΎΠΈΡ ΡΡΠ°ΡΠ΅ΠΉ. ΠΡΠ»ΠΈ Π²Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΡΠΈ Β«ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈΒ», Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΈΡ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ, ΡΠΎ Π²Π°ΠΌ ΠΏΡΠΈΠ΄ΡΡΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ATS ( App Transport Security) Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠΈΡ http Β«ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊΒ», Π½ΠΎ ΡΡΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ ΡΠ°ΠΌΠ°Ρ Ρ ΠΎΡΠΎΡΠ°Ρ ΠΈΠ΄Π΅Ρ. ΠΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ°ΠΌΠΈ.