我有一个ViewController在我用它init()创建一个热流PublishSubject.然后我将流传递给我ViewModel使用stream.asObservable()的viewDidLoad(),因为ViewModel其他依赖项是从视图生成的流,所以它必须等到视图的绑定完成后再创建ViewModel.在创建之后,ViewModel我将我的事件推ViewController入流中,然后期望ViewModel通过触发异步请求(也已用Rx包装)来对事件做出反应.
视图控制器:
class ExampleViewController: ViewController {
....
private let exampleStream: PublishSubject<Bool>
init() {
self.exampleStream = PublishSubject<Bool>()
}
viewDidLoad() {
self.viewModel = viewModelFactory.create(exampleStream.asObservable())
self.exampleStream.onNext(true)
}
....
}
Run Code Online (Sandbox Code Playgroud)
视图模型:
class ExampleViewModel {
init(stream: Observable<Bool>) {
stream.flatMap { _ in
doSomethingAsyncThatReturnsAnObservable()
}
}
private func doSomethingAsyncThatReturnsAnObservable() -> Observable<CustomObject> { ... }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是doSomethingAsyncThatReturnsAnObservable()当流中只有一个事件时被调用两次.我通过使用var count = 1; stream.subscribeNext { _ in …
在此之前,我想列出我已经阅读的帖子并尝试实现答案(避免重复):
我正在开发SDK,我已经创建了一些UI测试.我试图不连接到后端系统并通过在测试时在本地机器上运行的存根服务器来模拟它们.所有请求都必须转到此服务器.
我创建了一个永远不会提交到App Store的虚拟应用程序.通过这个应用程序,我计划测试SDK的屏幕.我按照上面的帖子和文章,并包含一个异常,将我的localhost服务器的不安全连接到虚拟应用程序的Info.plist文件中.它看起来如下:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
是的我允许各种例外.网络响应不会抱怨应用程序没有与localhost的不安全连接的例外,而只是返回以下内容:
[Result]: FAILURE: Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo={NSUnderlyingError=0x170248940 {Error Domain=kCFErrorDomainCFNetwork Code=-1004 "(null)" UserInfo={_kCFStreamErrorCodeKey=61, _kCFStreamErrorDomainKey=1}}, NSErrorFailingURLStringKey=http://localhost:7878/endpoint, NSErrorFailingURLKey=http://localhost:7878/endpoint, _kCFStreamErrorDomainKey=1, _kCFStreamErrorCodeKey=61, NSLocalizedDescription=Could not connect to the server.}
[Timeline]: Timeline: { "Request Start Time": 510144201.835, "Initial Response Time": 510144201.860, "Request Completed Time": 510144201.860, "Serialization Completed Time": 510144201.860, "Latency": 0.025 secs, "Request …Run Code Online (Sandbox Code Playgroud)