问题标签 [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 投票
1 回答
493 浏览

swift - Swift Combine:替代方案也有 eraseToAnySubscriber?

当我的红色、绿色或蓝色变量发生变化时,我正在尝试使用组合来更新颜色。我看过的示例使用 sink(),这对我来说似乎很合适,但 eraseToAnySubscriber 是 MIA,我找不到替代品。

似乎可行的是对计算变量使用 assign() ,但这似乎有点 hack。

有什么方法可以保存 sink() 返回的值吗?

0 投票
1 回答
132 浏览

swiftui - 无法在视图之间共享环境

环境: Xcode 11.0 beta 4 (11M374r)

我无法用第二种观点分享“环境”。

我在 SceneDelegate 中实例化了环境 BindableObject:

SceneDelegate.swift: 在此处输入图像描述

我在基础(ContentView)和详细视图中都使用了@EnvironmentObject。

环境已经在 SceneDelegate 中设置好了,所以它应该对所有视图都可用。

ContentView 确实看到了环境。
但是 DetailView 爆炸了: 在此处输入图像描述

这是完整的代码:

我错过了什么?
我究竟做错了什么?


根据建议修订:

他修改 SceneDelegate 后的运行时错误消息:

在此处输入图像描述


这里有一个线索: 在此处输入图像描述

0 投票
2 回答
8024 浏览

swiftui - .send() 和 .sink() 似乎不再适用于 Xcode 11 Beta 5 中的 PassthroughSubject

在下面的代码中,当按下按钮时,应该在控制台中打印“测试”,但事实并非如此。该事件不通过发布者发送。知道 Xcode 11 Beta 5 中的 PassthroughSubject 发生了什么吗?(在 Xcode 11 Beta 4 中运行良好)

PS我知道按下按钮时还有其他方法可以打印字符串,我只想展示一个简单的发送接收示例

0 投票
1 回答
604 浏览

swift - Xcode 11 beta 5 中止陷阱:在@Published 变量上调用接收器时出现 6 错误

我有一个@Published变量来指示我的一个存储库类中的用户状态。

在测试中,我曾经sink很容易观察到变化并满足我的测试等待的期望。

原始测试代码如下所示:

这导致编译器错误如下Abort trap: 6

发生这种情况的项目与应用程序位于单独的 swift 包中。

当我尝试从应用程序中使用它时(测试中没有),结果是一样的。另外,我尝试过其他出版商,例如。JustFuture从网络调用返回,所有这些都与sink.

我从 beta 4 开始就有这个问题,但在以前的版本中从未尝试过,可能也会出现在这些问题中。我注意到,在 beta 4 和 5 之间,Combine 发生了巨大的变化,但是错误仍然存​​在。

是否有人设法在外部库sink中的变量上使用该函数而没有此类错误?@Published

如果我误解了某些东西,请纠正我,现在我不得不假设,问题出在 Apple 的最后。

0 投票
3 回答
4230 浏览

swift - SwiftUI 中的计算(NSObject)属性不会更新视图

所以,我想要一个Text根据我的 CoreData 模型的内容来改变它的内容。为此,我在 Xcode beta 4 中使用了一个计算属性,但它似乎不再起作用了。这是一个错误还是我没有看到其他问题?

self.objectWillChange.send()我遇到的问题是我的视图(和计算的属性)在我的商店中调用时似乎没有得到更新。

我还尝试将我的 var '导出'到商店并从那里获取它,结果相同......


编辑: 我只是对另一个类进行了同样的尝试,但它并不能仅objectWillChange.send()用于但仅与@Published它一起工作,如果从 NSObject 继承的类即使停止工作...


我刚刚发现:与

这是我的问题的一个非常简化的版本,我知道我的 DataModel 工作是因为值发生了变化并被self.objectWillChange.send()调用,但我的视图由于某种原因没有更新......

0 投票
1 回答
1055 浏览

scenekit - SwiftUI + Scenekit + Combine + GeometryReader ==> 可滚动的 3D 模型列表 + 通过滚动列表旋转 3D 模型

我想创建一个可滚动的 3D 模型列表(此处:Xcode 的默认船舶模型,您可以在 Xcode 的游戏项目中找到)。

为此,我创建了 3 个视图结构:

  • 一种用于查看 3D 模型(称为ScenekitView
  • 一个用于 CardView (称为MyCardView
  • 一个用于 3D 模型的可滚动列表(称为 MyCardsListView)

以下是结构:

ScenekitView (顺便说一句,我将Xcode 的默认游戏项目的art.scnassets文件夹添加到了我的Single View App项目中)

我的卡片视图

我的卡片列表视图

MyCardsListView我得到每张卡片的最小 X 位置使用GeometryReader

我的目标是:

当我在MyCardsListView滚动卡片时,每个船模型都应该相对于其卡片的最小 X 位置旋转(它们都不应该同时以相同的旋转角度旋转)

(我知道我在使用绑定、状态等方面可能会犯很多错误,对此感到抱歉)

0 投票
4 回答
6705 浏览

xcode - 为单个对象而不是对象数组发布的作品

我正在尝试制作可单独移动的物体。我能够成功地为一个对象做到这一点,但是一旦我将它放入一个数组中,这些对象就不能再移动了。

模型:

多个图像(图像不跟随拖动):

单张图片(图片跟随手势):

我希望单个项目能够自由移动。我看到坐标正在更新,但每个图像的位置都没有。

0 投票
1 回答
5425 浏览

swift - Swift Combine - @Published 属性数组

我目前正在使用 SwiftUI 和 Combine 做一个项目。我在 Xcode11 Beta 5 上。我想获取我的 Github 存储库,显示它们,然后能够为其中的一些添加书签。

我能够获取它们并显示它们。我正在使用结合 @Published 属性包装器来更新我的视图。到现在为止,一切都按预期进行。

所以我继续下一步,为存储库添加书签。我想使用 Realm 来持久化这些存储库。

我的问题是,我有一个 Observable 类,它有一个@Published存储库数组。Repository 是一个可解码的类。在我的 Repository 类中,我有一个简单的类属性isFavorite现在设置为 false。

在我的存储库列表中,当我单击存储库以查看详细信息时,我希望能够将其添加为书签。所以我从我的存储库数组中通过它的 id 检索它的索引,并将它的属性isFavorite设置为 true。但我的观点没有更新。我的意思是我有一个条件渲染,它被固定为假。

这是我的代码:

我不知道为什么我的 Button 组件从不显示Image(systemName: "star.fill").foregroundColor(Color.yellow)当我打印isFavorite属性时,它的值从 true 变为 false ,反之亦然,但我的视图没有更新。

我从 Apple Developer 那里完成了教程,他们做了完全相同的事情,所以我不知道为什么会出现这个错误,我错过了什么?

一些帮助将不胜感激和/或对我的代码进行评论:)

谢谢

PS:为了不发布更长的代码,我已将其上传到 Pastebin https://pastebin.com/zjDwQSGq

0 投票
1 回答
2389 浏览

observable - 如何设置多个相同类型的环境对象

我发现了这个问题SwiftUI: Putting multiple BindableObjects into Envionment

答案说 environmentObject(ObservableObject) 返回修改后的视图,因此我可以为多个 environmentObject 创建调用链。

我想知道如果 firstBindable 和 secondBindable 是同一类型会产生什么结果。如何.environmentObject()知道程序员打算在firstBindable和之间设置的确切值是什么secondBindable

所以我测试了这个

  1. 我做了一个 ObservableObject 类
  1. 从 sceneDelegate 调用 environmentObject 链
  1. 并使用 View 中的值
  1. 结果是'1st 1st'

如果我的代码调用一个 .environmentObject() 之类的

TestView 中的 tmp1 和 tmp2 具有相同的值TempStr(initStr: "1st")。看起来.environmentObject()call 设置了相同类型的所有值。


实际上,我知道它不起作用,但我只是尝试使用这个问题。

我想知道实现目标的正确方法是什么。

谢谢

0 投票
2 回答
1695 浏览

swift - 将异步方法转换为组合

我正试图将我的头包裹在Combine周围。

这是我想翻译成组合的方法,以便它返回 AnyPublisher。

整个事情在单独的调度队列上执行,因为从钥匙串读取和解密可能很慢。

我第一次尝试拥抱联合

但是我如何将钥匙串中的读取和解密移动到单独的队列中呢?它可能应该看起来像

我将如何从我的私有方法调用中返回发布者?(见代码中的注释)

有没有更漂亮的解决方案?