从 RACSignal 迁移到 ReactiveSwift 或 RAC5
Migrate from RACSignal to ReactiveSwift or RAC5
我是 Swift 的新手,这就是为什么我是 Reactive Cocoa v5 或 Reactive Swift 的新手。
以前我将 RACSignal 与 RAC 2.x 一起使用,我喜欢这样做:
- (RACSignal *)signalForGET:(NSString *)URLString parameters:(NSDictionary *)parameters {
return [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
AFHTTPRequestOperation *op = [self GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
[subscriber sendNext:responseObject];
[subscriber sendCompleted];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[subscriber sendError:error];
}];
return [RACDisposable disposableWithBlock:^{
[op cancel];
}];
}];
}
在这里我喜欢它取消一次性请求,而且我可以通过在返回的信号上调用 dispose
方法手动取消它。
我对 Reactive Swift 中的所有这些东西有点困惑,比如 SignalProducers 等
请举例说明如何使用最新的 Swift/ReactiveSwift/ReactiveCocoa 版本实现相同的功能。 主要要求 是能够在我想要的任何地方取消请求(或处理信号),并在处理时自动取消请求
了解 Signal
和 SignalProducer
的重要一点是 Hot
和 Cold
信号之间的区别。
基本上,Hot
信号是一个不关心其观察者的信号。它发送它的值,无论它是否有一个、多个甚至根本没有观察者。最重要的是:新观察不会对信号造成副作用,每个新订阅者都会得到与其他订阅者完全相同的事件(减去订阅前已经发生的事件!)!想想用户输入、传感器数据……(忽略 starting/stopping 传感器)。
根据我的经验,真正的 Hot
信号在实践中很少见..
相比之下,Cold
信号是一个关心其观察者的信号 - 每个订阅 Cold
信号都可能产生副作用,并且订阅者会根据该副作用接收事件。因此,两个不同的观察者各自启动一次副作用并获得不同的事件集。
在 RAC 中,Cold
信号由 SignalProducer
表示。您可能还会将 SignalProducer
视为信号工厂(因此得名)- start
ing a SignalProducer
执行副作用,而 returns a Signal
在其上发送事件。
这几乎就是您的代码段所做的。
Disposable
自 RAC 2.x 以来变化不大,您仍然可以使用它。您可能刚刚错过了在创建 SignalProducer
:
时如何使用它
func producerForGET(urlString: String, parameters: [String: String]) -> SignalProducer<Data, NSError> {
return SignalProducer<Data, NSError> { observer, disposable in
let operation = GET(url: urlString, parameters: parameters, success: { operation, responseObject in
observer.send(value: responseObject)
observer.sendCompleted()
}, failure: { error in
observer.send(error: error)
})
disposable += {
print("Disposed")
operation.cancel()
}
}
}
这是一个简单的示例,说明如何使用它:
producerForGET(urlString: "Bla", parameters: [:])
.start() // Performs the request and returns a Signal
.dispose() // Runs the disposable block and cancels the operation
我是 Swift 的新手,这就是为什么我是 Reactive Cocoa v5 或 Reactive Swift 的新手。
以前我将 RACSignal 与 RAC 2.x 一起使用,我喜欢这样做:
- (RACSignal *)signalForGET:(NSString *)URLString parameters:(NSDictionary *)parameters {
return [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
AFHTTPRequestOperation *op = [self GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
[subscriber sendNext:responseObject];
[subscriber sendCompleted];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[subscriber sendError:error];
}];
return [RACDisposable disposableWithBlock:^{
[op cancel];
}];
}];
}
在这里我喜欢它取消一次性请求,而且我可以通过在返回的信号上调用 dispose
方法手动取消它。
我对 Reactive Swift 中的所有这些东西有点困惑,比如 SignalProducers 等
请举例说明如何使用最新的 Swift/ReactiveSwift/ReactiveCocoa 版本实现相同的功能。 主要要求 是能够在我想要的任何地方取消请求(或处理信号),并在处理时自动取消请求
了解 Signal
和 SignalProducer
的重要一点是 Hot
和 Cold
信号之间的区别。
基本上,Hot
信号是一个不关心其观察者的信号。它发送它的值,无论它是否有一个、多个甚至根本没有观察者。最重要的是:新观察不会对信号造成副作用,每个新订阅者都会得到与其他订阅者完全相同的事件(减去订阅前已经发生的事件!)!想想用户输入、传感器数据……(忽略 starting/stopping 传感器)。
根据我的经验,真正的 Hot
信号在实践中很少见..
相比之下,Cold
信号是一个关心其观察者的信号 - 每个订阅 Cold
信号都可能产生副作用,并且订阅者会根据该副作用接收事件。因此,两个不同的观察者各自启动一次副作用并获得不同的事件集。
在 RAC 中,Cold
信号由 SignalProducer
表示。您可能还会将 SignalProducer
视为信号工厂(因此得名)- start
ing a SignalProducer
执行副作用,而 returns a Signal
在其上发送事件。
这几乎就是您的代码段所做的。
Disposable
自 RAC 2.x 以来变化不大,您仍然可以使用它。您可能刚刚错过了在创建 SignalProducer
:
func producerForGET(urlString: String, parameters: [String: String]) -> SignalProducer<Data, NSError> {
return SignalProducer<Data, NSError> { observer, disposable in
let operation = GET(url: urlString, parameters: parameters, success: { operation, responseObject in
observer.send(value: responseObject)
observer.sendCompleted()
}, failure: { error in
observer.send(error: error)
})
disposable += {
print("Disposed")
operation.cancel()
}
}
}
这是一个简单的示例,说明如何使用它:
producerForGET(urlString: "Bla", parameters: [:])
.start() // Performs the request and returns a Signal
.dispose() // Runs the disposable block and cancels the operation