相关疑难解决方法(0)

Combine + SwiftUI中的最佳数据绑定实践?

在RxSwift中,很容易将a Driver或Observablein 绑定到a View Model中的某个观察者ViewController(即UILabel)。

我通常更喜欢用其他可观察变量创建的可观察变量建立一个管道,而不是“强制”推送值(例如通过a PublishSubject)。

让我们使用此示例:从网络中获取一些数据后更新aUILabel


RxSwift + RxCocoa示例

final class RxViewModel {
    private var dataObservable: Observable<Data>

    let stringDriver: Driver<String>

    init() {
        let request = URLRequest(url: URL(string:"https://www.google.com")!)

        self.dataObservable = URLSession.shared
            .rx.data(request: request).asObservable()

        self.stringDriver = dataObservable
            .asDriver(onErrorJustReturn: Data())
            .map { _ in return "Network data received!" }
    }
}
Run Code Online (Sandbox Code Playgroud)
final class RxViewController: UIViewController {
    private let disposeBag = DisposeBag()
    let rxViewModel = RxViewModel() …
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift swiftui combine

10
推荐指数
2
解决办法
1248
查看次数

使用Swift Combine创建Timer Publisher

我一直在看通过SwiftUI WWDC进行的数据流。他们有一张带有示例代码的幻灯片,其中他们使用Timer发布者,该发布者连接到SwiftUI视图,并随时间更新UI。

我正在编写一些代码,在其中我想做完全相同的事情,但是无法弄清楚它PodcastPlayer.currentTimePublisher是如何实现的,然后将其连接到UI结构。我还看了所有关于Combine的视频。

我该如何实现?

示例代码:

struct PlayerView : View {
  let episode: Episode
  @State private var isPlaying: Bool = true
  @State private var currentTime: TimeInterval = 0.0

  var body: some View {
    VStack { // ...
      Text("\(playhead, formatter: currentTimeFormatter)")
    }
    .onReceive(PodcastPlayer.currentTimePublisher) { newCurrentTime in
      self.currentTime = newCurrentTime
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

publisher swift swiftui combine

9
推荐指数
3
解决办法
1355
查看次数

更改为@EnvironmentObject中的@Published var不会立即反映出来

在这种特定情况下,当我尝试更改@EnvironmentObject的时@Published var,我发现该视图并没有立即失效并立即更新。相反,仅在离开模态并返回后,才会反映对变量的更改。

import SwiftUI

final class UserData: NSObject, ObservableObject  {
    @Published var changeView: Bool = false
}

struct MasterView: View {
    @EnvironmentObject var userData: UserData
    @State var showModal: Bool = false

    var body: some View {
        Button(action: { self.showModal.toggle() }) {
            Text("Open Modal")
        }.sheet(isPresented: $showModal, content: {
            Modal(showModal: self.$showModal)
                .environmentObject(self.userData)
        } )
    }
}

struct Modal: View {
    @EnvironmentObject var userData: UserData
    @Binding var showModal: Bool

    var body: some View {
        VStack {
            if userData.changeView { …
Run Code Online (Sandbox Code Playgroud)

swiftui

4
推荐指数
2
解决办法
674
查看次数

标签 统计

swiftui ×3

combine ×2

swift ×2

ios ×1

publisher ×1

rx-swift ×1