gpt4 book ai didi

ios - ReactiveSwift 刷新数据

转载 作者:行者123 更新时间:2023-11-28 11:47:45 25 4
gpt4 key购买 nike

我是 ReactiveSwift 的初学者。这是在我的 View 模型中获取代码:

private let viewDidLoadProperty = MutableProperty<Void?>(nil)
public func viewDidLoad() {

disposables += self.weatherFetcher.fetchCurrentWeather().startWithResult { (result) in
switch result {
case .success(let value):
_ = value?.list?
.map { [weak self] weatherData in
if let weather = weatherData.weather?.first {
self?.weatherFetcher.fetchWeatherImage(icon: weather.icon).startWithResult { (result) in
switch result {
case .success(let iconData):
self?.cellViewModels.append(WeatherCellViewModel(with: weatherData, iconData: iconData))
case .failure(let error):
print("something went wrong - \(error)")
}
}
} else {
self?.cellViewModels.append(WeatherCellViewModel(with: weatherData, iconData: nil))
}
}
case .failure(let error):
print(error)
}
}

self.viewDidLoadProperty.value = ()
}

当在 ViewController 中调用 viewDidLoad 时, View 模型开始获取数据。如何告诉VC fetch结束,可以调用refreshData了?是否有可能捕捉到 viewDidLoad 函数的结尾,我的意思是在获取之后。

初始化代码:

init(weatherFetcher: WeatherFetcher) {
self.weatherFetcher = weatherFetcher
didStartLoadingWeather = self.viewDidLoadProperty.signal.skipNil()
}

最佳答案

我首先会建议您使用 ViewModel,它负责代表 UIViewController 执行这些操作。

直接回答您的问题。您将不得不使用某种机制来保存数据。这可以是 PropertyMutableProperty。我的建议是前者。您还需要一个触发器,因此当 viewDidLoad 发生时,您可以进行通信。假设您有一个 ViewModel:

import ReactiveSwift
import enum Result.NoError

public enum ViewState<T> {
case loading
case loaded([T])
case failure(YourError)
}

class ViewModel {

private let (signal, observer) = Signal<Void, NoError>.pipe()
let state: Property<ViewState<WeatherCellViewModel>>

init() {
let fetch = signal.flatMap(.latest, transform: fetcher)
self.state = Property.init(initial: .loading then: fetch)
}

func fetch() {
observer.send(value: ())
}
}

我会把 fetch 的完成留给你。但是:

  1. 这种方法允许您保持状态(通过属性)并允许外部触发。
  2. 您现在可以从state 中读取值。
  3. fetcher 是在初始化时创建的,只有在调用 fetch 函数后才会触发。

关于ios - ReactiveSwift 刷新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52270501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com