问题标签 [combine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3786 浏览

swiftui - 当我的@Published NSManagedObjects 数组更改时,我的 SwiftUI 列表不会更新

我正在构建一个基本的笔记应用程序,我的应用程序的主页应该显示用户笔记的列表。Note 用 Note 类表示,这是一个 Core Data 生成的类。(我的最终目标是通过 NSPersistentCloudKitContainer 与 CloudKit 同步的笔记应用程序。)

到目前为止,当用户加载应用程序时,列表会显示正确的笔记数据。但是,当我尝试通过点击 my 创建新便笺时newNoteButton,便笺数组会发生变化,但我的 UI 不会改变。我必须重新加载应用程序才能看到新笔记。我可能做错了什么?对不起下面的混乱代码:

NoteList.swift

UserNotes.swift

Note.swift(由 Core Data 生成)

Note.swift(扩展)

0 投票
3 回答
6912 浏览

swift - Swift Combine:在可观察对象中使用计时器发布者

在这个问题被标记为另一个问题的重复之前,我试图了解发布者是如何以我不期望的方式工作的。

使用与先前所述问题的答案相同的示例:

在这个阶段,我想做的只是我的视图模型直接发布值。我不想声明视图将接收这些类型的值。

理想情况下,我想把我的发布者变成一个正确的发布者......我虽然下面的代码可以工作:

我在为我做错什么assign

为什么不触发?

编辑:环境对象在SceneDelegate创建时钟视图后设置。排除的代码附在下面:

0 投票
1 回答
5197 浏览

swiftui - 在主体外访问 SwiftUI 视图中的状态变量

我有一个内容视图,我想动态跟踪高度。

我已经实现了这个解决方案,但我遇到了这个异常:

致命错误:在 View.body 之外访问状态:文件

我该怎么做才能让键盘高度动态更新我的用户界面

0 投票
1 回答
4171 浏览

swift - 如何展平 AnyPublisher>?

我从一个 RESTful 服务器加载端点,其中一些是多页的。它们由标头响应中的“x-pages”字段表示。我想创建一个发布者,它将所有页面中的所有对象作为单个数组返回。

最后一个 return 语句存在编译错误。

如何修复这个“嵌入式”发布者?

在创建多页发布者时,我可以在防护之后立即添加一个接收器以读取 lastPage 值。然后将let publishers = ...部分从地图中提升一级,我的 Publishers.Sequence 返回值将是正确的。但这在很多层面上似乎都是错误的。拆分执行,不可组合。

此外,我意识到我的实现加载了第一页两次。稍后拆分管道并合并数据有效负载会更好,我想找到那个解决方案,但我需要先解决这个问题。如果这是一个无望的原因,那么就这样吧,任何惯用的组合解决方案都将被接受。

0 投票
4 回答
22360 浏览

swift - SwiftUI 和 MVVM - 模型和视图模型之间的通信

我一直在尝试使用的 MVVM 模型,SwiftUI但有些东西我还没有完全理解。

SwiftUI使用@ObservableObject/@ObservedObject来检测视图模型中触发重新计算body属性以更新视图的更改。

在 MVVM 模型中,这就是视图和视图模型之间的通信。我不太明白的是模型和视图模型是如何通信的。

当模型发生变化时,视图模型应该如何知道呢?我考虑过手动使用新Combine框架在模型内创建视图模型可以订阅的发布者。

但是,我创建了一个简单的示例,这使得这种方法非常乏味,我认为。有一个模型叫做Game,它包含一个Game.Character对象数组。一个角色有一个strength可以改变的属性。

那么如果视图模型改变strength了角色的属性呢?为了检测这种变化,模型必须订阅游戏中的每一个角色(可能还有很多其他的东西)。是不是有点过分了?还是有很多发布者和订阅者是正常的?

还是我的示例没有正确遵循 MVVM?我的视图模型不应该将实际模型game作为属性吗?如果是这样,有什么更好的方法?

我希望我的意思很清楚。很难解释,因为它令人困惑

谢谢!

0 投票
2 回答
877 浏览

swift - NotificationCenter.Publisher VS PassThroughSubject

我有一个对象,我想通过多个侦听器/订阅者发送,所以我查看了 Combine,我看到了 2 种不同类型的发布者,即NotificationCenter.PublisherPassThroughSubject. 我很困惑为什么有人会使用NotificationCenter.Publisherover PassThroughSubject

我想出了下面的代码,演示了两种方式。总结一下:

  • NotificationCenter.Publisher需要有一个Notification.Name静态属性
  • 真的不是那种类型安全的(因为我可以为同一个Notification.Name/不同的发布者发布不同类型的对象Notification.Name
  • 需要在NotificationCenter.default(而不是发布者本身)上发布新值
  • map对闭包中使用的类型的显式向下转换

在什么情况下有人会使用NotificationCenter.Publisherover PassThroughSubject

0 投票
1 回答
4275 浏览

swiftui - 是什么导致在此代码中调用 updateUIView()?

我知道@State 变量的更改会通知@Binding 状态已更改,但是什么会导致调用 updateUIView() 方法?@Binding 和调用之间显然存在一些隐藏的联系,但它是如何工作的呢?

0 投票
2 回答
1338 浏览

swift - 实现与 URLSession 发布者和组合的重新连接

我想知道是否有办法使用新的 Apple 框架实现重新连接机制结合和使用 URLSession 发布者

  • 试图在 WWDC 2019 中找到一些例子
  • 试图玩waitsForConnectivity没有运气(它甚至没有在自定义会话上调用委托)
  • 尝试过URLSession.background,但在发布过程中崩溃了。

我也不明白我们如何以这种方式跟踪进度
是否有人已经尝试过这样做?

upd:
似乎在 Xcode 11 Beta 中waitsForConnectivity 不起作用

upd2:
Xcode 11 GM -waitsForConnectivity正在工作,但在设备上。使用默认会话,设置标志并实现会话委托。task is waiting for connectivity无论您是否使用带有回调的初始化任务,都会调用方法。

0 投票
2 回答
4715 浏览

swiftui - 带有 @Binding 控件的 SwiftUI 动态列表

如何使用@Binding 驱动的控件构建动态列表,而无需手动引用数组?这似乎很明显,但使用 List 或 ForEach 遍历数组会产生各种奇怪的错误。

这不起作用:

类型“_”没有成员“id”

也没有:

无法推断通用参数“SelectionValue”

0 投票
4 回答
12724 浏览

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

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

我通常更喜欢构建一个管道,使用从其他 observables 创建的 observables,而不是“强制性地”推送值,比如通过 a PublishSubject)。

让我们使用这个例子:从网络获取一些数据后更新 aUILabel


RxSwift + RxCocoa 示例


组合 + UIKit 示例

在基于 UIKit 的项目中,您似乎可以保持相同的模式:

  • 视图模型公开发布者
  • 视图控制器将其 UI 元素绑定到这些发布者

SwiftUI 呢?

SwiftUI 依赖于属性包装器@Published和协议ObservableObjectObservedObject来自动处理绑定(从Xcode 11b7 开始)。

由于(AFAIK)属性包装器不能“动态创建”,因此您无法使用相同的模式重新创建上面的示例。以下不编译

我能想到的最接近的方法是订阅您的视图模型(UGH!)强制更新您的 property,这根本感觉不正确和被动。

在这个没有 UIViewController 的新世界中,“旧的绑定方式”会被遗忘和取代吗?