从Racsignal迁移到ReactiveSwift或Rac5



我是Swift的新来者,这就是为什么我是新手的反应性可可V5或反应性迅速的原因。

以前我使用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方法手动取消它。

我对反应性迅速中的所有这些东西有点困惑,例如信号生产者等。

请给我示例如何使用最新的Swift/reactiveswift/reactivecocoa版本实现相同的示例。主要要求在我想要的任何地方都具有取消请求(或处置信号(的能力,并且请求自动在Dispose上被取消

有关SignalSignalProducer的重要重要性是HotCold信号之间的区别。

基本上,Hot信号是不关心其观察者的信号。它发送其值,无论它是否具有一个,多个甚至根本没有观察者。最重要的是:新的观察结果不会在信号中引起副作用,每个新订户将获得与其他订户完全相同的事件(减去订阅前已经发生的事件!(!想想诸如用户输入,传感器数据等诸如...(忽略启动/停止传感器之类的东西(。

根据我的经验,真正的Hot信号在实践中很少。

相比之下,Cold信号是关心其观察者的信号 - 每种Cold信号的订阅可能会执行副作用,并且订阅者根据该副作用接收事件。因此,两个不同的观察者一次启动副作用,并获得不同的事件集。

在RAC中,Cold信号由SignalProducer表示。您可能还会将SignalProducer视为信号的工厂(因此名称(-start SignalProducer执行副作用并返回发送事件的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

相关内容

  • 没有找到相关文章

最新更新