ObservableObjec
@Published
Combine
View Model
SwiftUI
UIKit
MVVM
bind
UI
View Mode
Input
Output
View
ViewController
ObservableObject
API
WeatherDetail
temp
Main
JSON
Identifiable
[WeatherDetail]
List
id,
URLs
city
URL
absoluteURL (city: String)
fetchWeather (for city: String) -> AnyPublisher<WeatherDetail, Never>
Publisher
AnyPublisher<WeatherDetail, Never>
Never
WeatherDetail.placeholder
absoluteURL(city:city)
dataTaskPublisher(for:)
(data: Data, response: URLResponse)
Failure
URLError
map { }
data: Data, response: URLResponse)
data
catch (error ... )
main
eraseToAnyPublisher()
AnyPublisher
TempViewModel
@Published var city: String
@Published var currentWeather = WeatherDetail.placeholder
$city
init?
currentWeather
assign (to: \.currentWeather, on: self)
fetchWeather (for city: String)
WeatherAPI
flatMap
init( )
AnyCancellable
ARC
init()
var cancellableSet
TempViewMode
cancellableSet
store ( in: &self.cancellableSet)
debounce
removeDuplicates
john
joe
Xcode
ContentView
@ObservedObject
model
Text ("Hello, World!")
Text ("WeatherApp")
TextField ("City", text: self.$model.city)
model: TempViewModel()
$model.city
model.currentWeather.main?.temp
binding
Key-Value Observing
KVO
key paths
FRP
Delegation
Boxing
didSet { }
UITextField
UILabel
Outlet
viewModel
text
viewDidLoad
binding ()
cityTextField.textPublisher
assign (to: \.city, on: viewModel)
cityTextField
$currentWeather
sink
receiveValue
temperatureLabel
API key