2017-04-18 20 views
3

我是Swift新手,这就是为什么我是Reactive Cocoa v5或Reactive Swift新手。从RACSignal迁移到ReactiveSwift或RAC5

以前我用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手动取消方法返回的信号。

我有点困惑所有这些东西在无斯威夫特,像SignalProducers等

请给我例子,如何实现与最新斯威夫特/ ReactiveSwift/ReactiveCocoa版本相同。 主要要求是不得不取消请求(或处理信号),无论我想要的,有要求自动获取有关处置

回答

6

重要的取消,了解有关SignalSignalProducer能力HotCold信号之间的区别。

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

以我的经验,真正Hot信号在实践中罕见的..

相比之下,Cold信号是一个关心它的观察员 - 每个订阅到Cold信号进行潜在的副作用和用户接收基于这种副作用的事件。所以两个不同的观察者每个都会开始一次副作用并获得不同的事件集合。

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

感谢兄弟。这与我在此之前尝试的方式大致相同,但因为Xcode自动完成不识别这种信号生成器初始化程序而感到困惑。此外,我没有得到它为什么不允许在这里使用错误类型的错误...但非常感谢你。 –