我正在尝试创建一个信号,在处置时取消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