22682
9258
我正在RxSwift中使用重试运算符。根据其文档,当遇到错误时,它将“重新订阅”可观察到的源。
这一切都很好。但是,我不确定在包含热观测值或热/冷观测值混合的“源可观测”时如何推理。
我敢肯定的一个例子:
让coldObservable = Observable  .interval(.seconds(1),调度程序:MainScheduler.instance)
let coldObservableRetry = coldObservable.flatMapLatest {num in
如果num%3 == 0 {return .just(num)}
否则{return .error()}
}
.retry(2)//重试包含原始尝试
coldObservableRetry.subscribe(onNext:{print($ 0)})//在错误输出之前打印1、2、1、2。
我不确定的一个例子:
let hotObservable = Observable  .interval(.seconds(1),调度程序:MainScheduler.instance).publish()。connect()
让hotObservableRetry = hotObservable.flatMapLatest {
如果num%3 == 0 {return .just(num)}
否则{return .error()}
}
.retry(2)
hotObservableRetry.subscribe(onNext:{print($ 0)})//这里发生了什么?
我不确定的另一个示例:
让coldObservable = Observable  .interval(.seconds(1),调度程序:MainScheduler.instance)
让delayHotObservable = Observable  .interval(.seconds(1),调度程序:MainScheduler.instance).delay(.milliseconds(100),调度程序:MainScheduler.instance).publish()。connect()
let blendObservableRetry = Observable.combineLatest(coldObservable,delayHotObservable).map {$ 0 + $ 1} .flatMapLatest {num in
如果num%3 == 0 {return .just(num)}
否则{return .error()}
}
.retry(5)
blendObservableRetry.subscribe(onNext:{print($ 0)})//这里发生了什么?重新订阅带有可观察到的热和冷现象的CombineLatest甚至意味着什么?
我不确定的另一个例子:
让coldObservable = Observable  .interval(.seconds(1),调度程序:MainScheduler.instance)
let hotObservable = Observable  .interval(.seconds(1),调度程序:MainScheduler.instance).publish()。connect()
let blendObservable2Retry = coldObservable.flatMapLatest {_在hotObservable}
.flatMapLatest {
如果num%3 == 0 {return .just(num)}
否则{return .error()}
}
.retry(2)
blendObservable2Retry.subscribe(onNext:{print($ 0)})//这里发生了什么? 
您的许多示例都无法编译,因此会发生编译错误。 :-)但是要回答这个问题...
有一些重要的事情要牢记。
每个操作员都订阅其源可观察对象并生成一个新的可观察对象。
订阅一个冷的可观察对象时,它将发出0 ... N个下一个事件,然后发出一个stop事件(已完成或错误)。它将为每个订阅提供自己的事件集。
热的可观察对象直到它们的连接被调用后才开始发射。所有订阅将共享同一组事件。
最后,在这种情况下,debug是您的朋友。
因此,对于您的第一个示例,您不确定(经过调整后,它将编译并运行并添加了一些调试运算符):
func example(){
let hotObservable = Observable  .interval(.seconds(1),调度程序:MainScheduler.instance)
.debug(“发布前”)
。发布()
让hotObservableRetry = hotObservable
.debug(“发布后”)
.map {(num)-> Int in
警卫号%3!= 0否则{throw MyError()}
返回数字
}
.debug(“之后的地图”)
.retry(2)
.debug(“重试后”)
_ = hotObservableRetry.subscribe()
_ = hotObservable.connect()
}
将产生以下输出。
这里有一些关于输出的注意事项,将有助于学习过程。
订阅以相反的顺序发生。
发出第一个错误后,重试运算符将重新订阅地图运算符的observable,而map运算符的observable将重新订阅发布的observable。由于发布的可观察性很热门,因此重新订阅链就此停止。计时器的可观察项不会被重新订阅。
以上是理解该问题的要点。
重试后->已订阅
地图后->已订阅
发布后->订阅
发布之前->已订阅
发布前->事件下一个(0)
发布后->事件下一个(0)
映射后->事件错误(MyError())
地图后-> isDisposed
发布后-> isDisposed
地图后->已订阅
发布后->订阅
发布前->事件next(1)
发布后->事件next(1)
地图后->事件下一个(1)
重试后->事件next(1)
发布前->事件next(2)
发布后->事件next(2)
地图后->事件下一个(2)
重试后->事件next(2)
发布前->事件next(3)
发布后->事件next(3)
映射后->事件错误(MyError())
重试后->事件错误(MyError())
重试后-> isDisposed
地图后-> isDisposed
发布后-> isDisposed
发布前->事件next(4)
发布前->事件下一个(5)
发布前->事件下一个(6)
...
在您显示的下一个示例中,CombineLatest运算符重新订阅了热的可观察对象,但是可连接的可观察对象没有重新订阅其源。
7
|
你的答案
StackExchange.ifUsing(“ editor”,function(){
StackExchange.using(“ externalEditor”,function(){
StackExchange.using(“ snippets”,function(){
StackExchange.snippets.init();
});
});
},“代码段”);
StackExchange.ready(function(){
var channelOptions = {
标签:“” .split(“”),
id:“ 1”
};
initTagRenderer(“”。split(“”),“” .split(“”),channelOptions);
StackExchange.using(“ externalEditor”,function(){
//如果启用了摘要,则必须在摘要后触发编辑器
如果(StackExchange.settings.snippets.snippetsEnabled){
StackExchange.using(“ snippets”,function(){
createEditor();
});
}
别的 {
createEditor();
}
});
函数createEditor(){
StackExchange.prepareEditor({
useStacksEditor:否,
heartbeatType:“答案”,
autoActivateHeartbeat:否,
convertImagesToLinks:是,
noModals:是的,
showLowRepImageUploadWarning:是的,
声望:ToPostImages:10,
bindNavPrevention:是的,
后缀:“”,
imageUploader:{
brandingHtml:“采用\ u003ca href = \“ https://imgur.com/ \” \ u003e \ u003csvg class = \“ svg-icon \” width = \“ 50 \” height = \“ 18 \” viewBox = \“ 0 0 50 18 \” fill = \“ none \” xmlns = \“ http://www.w3.org/2000/svg \” \ u003e \ u003cpath d = \“ M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.7256 4.91628 46.0943 5.50789C45.74.6 4.313.6412 4.313.6662 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \“ / \ u003e \ u003cpath d = \” M32.492 10.1419C32.492 12.6954 34.1182 14.048437.0451 14.0484 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.5455C35.8209 11.5455 35.4954 10.8 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \“ / \ u003e \ u003cpath fill-rule = \” evenodd \“ clip-rule = \” evenodd \“ d = \“ M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.961511.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.66231 28.4555 4.94978 28.1109 5.50789C27.499 4.86533 26.7335 4.56087 25.7005 4.56087C23.1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 13.003 13.913 25.3607 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.1301 14.4373 27.2502 15.2321 25.777 15.2321C24.8349 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.452 12.5218 21.2429429 14.65218 21.2429429 .2429 16.7375 22.9072 17.6335 25.6622 17.6335ZM24.1317 9.27932C24.1317 7.94324 24.9928 7.09766 26.1024 7.09766C27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.279 u003cpath d = \“ M16.8045 11.9512C16.8045 13.2535 17.2637 13.8962 18.2965 13.8962C19.3298 13.8962 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 8.57809 4.89931 7.9466 5.5079C7.58314 4.9328 7.10506 4.66232 6.51203 4.66232C5.47873 4.662325.00066 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10.893 7.58817 10.893 8.94108V11.9512C10.893 13.2535 11.3711 13.8962 12.4044 13.8962C13.4375.13 90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \“ / \ u003e \ u003cpath d = \” M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.7917288 4.21 0.313 V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.8962 3.31675 13.2535 3.31675 11.9512V6.59049Z \“ / \ u003e \ u003cpath d = \” M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.400291 1.87209 0.400291Z \“ fill = \”#1BB76E \“ / \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e”,
contentPolicyHtml:“根据\ u003ca href = \“ https://stackoverflow.com/help/licensing \” \ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \“ https://stackoverflow.com获得许可的用户贡献/ legal / content-policy \“ \ u003e(内容策略)\ u003c / a \ u003e”,
allowUrls:是
},
onDemand:是的,
dispatchSelector:“。discard-answer”
,immediatelyShowMarkdownHelp:true,enableTables:true,enableSnippets:true
});
}
});
感谢您为Stack Overflow提供答案!
请务必回答问题。提供详细信息并分享您的研究!
但是要避免...
寻求帮助,澄清或回答其他答案。
根据意见发表声明;用参考或个人经验来备份它们。
要了解更多信息,请参阅有关编写出色答案的提示。
草稿已保存
草稿丢弃
注册或登录
StackExchange.ready(function(){
StackExchange.helpers.onClickDraftSave('#login-link');
});
使用Google注册
使用Facebook注册
使用电子邮件和密码注册
提交
以访客身份发布
姓名
电子邮件
必需,但从未显示
StackExchange.ready(
功能 () {
StackExchange.openid.initPostLogin('。new-post-login','https%3a%2f%2fstackoverflow.com%2fquestions%2f64950463%2fhow-do-rxswift-operators-affect-resubscribes%23new-answer','question_page' );
}
);
以访客身份发布
姓名
电子邮件
必需,但从未显示
发表您的答案
丢弃
点击“发布答案”,即表示您同意我们的服务条款,隐私政策和Cookie政策
不是您要找的答案?浏览标记为ios swift5 rx-swift的其他问题,或询问您自己的问题。