RACS主题和处置

时间:2015-08-03 11:41:58

标签: ios reactive-cocoa

我正在尝试创建一个信号,在处置时取消NSURLSessionDataTask。问题是我无法等待任务完成,直到我可以发送下一个值(实现Server-sent Events),但我必须使用NSURLSession委托方法。

我现在正在做的是创建一个RACSubject并为每个新请求返回它。新活动到达后,我sendNext:就此问题发表了看法。如果主题上没有更多订阅者,我的问题是找出何时有效取消任务。

到目前为止我发现的一种解决方法是创建一个虚拟信号并将其与主题合并(见下文)。

return [[RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
    return [RACDisposable disposableWithBlock:^{
        if ( dataTask.state != NSURLSessionTaskStateCanceling && dataTask.state != NSURLSessionTaskStateRunning ) {
            [dataTask cancel];
        }
    }];
}]
    merge:self.requests[@(dataTask.taskIdentifier)][kSubjectKey]];

但必须有更优雅的方式,或者?另外一个缺点是信号永远不会完成。如果我在伪信号中sendCompleted,则会立即调用dispose块。

我正在使用ReactiveCocoa 2.5.x

1 个答案:

答案 0 :(得分:0)

你有没看过这个library。基本上您只需要将委托方法转换为块,然后您可以使用creatSignal:调用内部声明块。如果您想自己将委托方法包装成块,请查看此post