- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 Future 做一个异步工作。
但是下面的 .sink() 闭包 永远不会被调用。
看起来 Future 的实例在它被调用后就被释放了。
Future<Int, Never> { promise in
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
promise(.success(1))
}
}
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { completion in
print(completion)
}, receiveValue: {
print($0)
})
Future<Int, Never> { promise in
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
promise(.success(1))
}
}
.receive(on: DispatchQueue.main)
.subscribe(Subscribers.Sink(receiveCompletion: { completion in
print(completion)
}, receiveValue: {
print($0)
}))
最佳答案
.sink
操作符做三件事:
Subscribers.Sink
。 subscribe
上调用 Publisher
,传递它创建的 Sink
。 AnyCancellable
,在销毁时取消 Sink
。它返回对此 AnyCancellable
的引用。 AnyCancellable
是一个引用计数对象。当对
AnyCancellable
的最后一个引用被销毁时,
AnyCancellable
本身也被销毁。那时,它调用了自己的
cancel
方法。
AnyCancellable
返回的
.sink
。所以 Swift 会立即销毁它,这意味着它会立即取消订阅。一秒钟后,您的
asyncAfter
闭包调用
promise
,但订阅已被取消,因此不会调用您的
receiveValue
闭包。
Subscribers.Sink
对象并将其传递给
subscribe
,因此没有创建
AnyCancellable
来包装
Sink
。所以没有什么会自动破坏订阅。一秒钟后,
asyncAfter
闭包调用
promise
。由于订阅没有被销毁,它仍然存在,所以你的
receiveValue
闭包被调用,然后你的
receiveCompletion
闭包被调用。
Subscribers.Sink
而不是
.sink
操作符。使用
.sink
,您
必须 保存返回的
AnyCancellable
,否则订阅将立即取消。但是通过直接使用
Subscribers.Sink
,您可以创建一个持续到订阅完成的订阅,您无需保存任何内容。当订阅完成时(使用
.finished
或
.failure
),
Sink
丢弃
Subscription
,这打破了保持它活着的保留周期,因此
Sink
和
Subscription
也被销毁,不会留下内存泄漏。
关于swift - .sink 和 Subscribers.Sink 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61216852/
我正在使用 Swift Joint,但不明白两者之间的区别 func subscribe(_ subscriber: S) where S : Subscriber, Self.Failure ==
大多数 Flowable.subscribe() 重载返回一个 Disposable ,它可以清理流。我习惯于这样做: Disposable d = Flowable.just() .map(
我正在尝试测试主题 symbol$ 的输出存在于我的组件上。 具体来说,当组件属性 symbol 时,主题符号 $ 应该发出(这是正确的词吗?)已经改变。 但是,我找不到测试输出到 symbol$ 的
Observable.just(10,20,30,40,50) .subscribe { Consumer{ Log.d(TAG, "Where
我在 subscribe 中有带有 subscribe 的代码: this.http.post('/update1', newData).subscribe( (response) => {
我有两个页面/模板, 仪表板(还包含一些用户特定数据)。 用户。 我正在使用带有 Blaze 模板的 Meteor 1.5。登陆页面是仪表板。我在两个模板中都使用集合 Users 的通用订阅。 场景
我刚接触 Angular2 一周! 基本上有 2 个 API 调用。 第一个 API 调用为我提供了一个 json 对象数组 (queryResults)。 (第一次订阅) 在 View 中显示该数组
我已经在 stackoverflow 上尝试了很多关于修复此错误的提议,但现在我只需要问一下,因为我已经花了很多时间,现在一无所获。 我有这个简单的服务: constructor(private ht
给定一个配置有任务执行器的发布-订阅 channel ,如果抛出异常,是否可以中断其有序订阅者的调用? 例如,在此示例中,“已工作”消息仍然由序列中的第二个服务激活器发送。我希望这种事不要发生。
我正在尝试使用 Intent to PDF 应用程序下载和发送 pdf 以显示此处显示的文件 answer of JDenais这是下载 pdf 并通过 Intent 传递它的代码。 public c
我目前正在调查 RxJS's .merge但是我也会在这里问这个问题,因为我发现这里的解释有时非常精彩。 好的,我有一个根据用户输入打开模态窗口的表单,我订阅模态关闭事件并传回一些我将在调用/订阅服务
我刚刚对我的 Angular 6 应用程序进行了 ng 升级,现在我得到: ERROR in node_modules/@angular/flex-layout/core/typings/observ
如果您有一个事件驱动的架构并且订阅事件的服务在继续创建链中的下一个事件之前必须等待多个事件(相同类型),那么最佳实践是什么? 一个例子是图书订单处理服务,它必须等待订单中的每一本书都被仓库处理,然后再
我使用下面的代码进行异步调用,我想知道在 getData() 函数中生成的 data 的值,但是,我得到 undefined 因为调用还没有解决。有什么办法可以解决吗? getData(address
我在订阅我的 HTML 页面中的下拉值更改时遇到实现 knockout Js 的问题。这是我的 HTML Request Types :
函数定义 resetComponent(){ console.log("1st"); ... this.background = { }; this.uploadMode = fals
在我的代码中,我正在使用 @Subscribe 注释来监听事件: @Subscribe public void orderUpdate(OrderUpdateEvent event) 我的问题是,对于
我正在使用 Angular2 和 NodeJS 编写 API,我正在为我的 ِAPI 实现服务,该 API 应该获取任务列表并显示它。这是任务服务: import {Injectable} from
我正在尝试使用来自服务器的 json 响应创建动态菜单,但出现此错误: MenuComponent.html:4 ERROR TypeError: Cannot read property 'subs
我查看了许多资源,包括 this , this和 this ,但我一直无法达到预期的效果。 我要做的就是验证用户(使用 firebase),然后在验证后加载他们的配置文件并将其存储在变量 userPr
我是一名优秀的程序员,十分优秀!