我正在尝试使用 ReactiveCococa 通过 NSInputStream 和 NSOutputStream 进行网络连接。连接代码如下所示:
-(RACSignal*) connect: (NSString *) url {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> theSubscriber) {
self.subscriber = theSubscriber;
// create inputStream and outputStream, initialize and open them
[self.inputStream open]
[self.outputStream open];
}];
return nil;
}
-(void) stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
switch (eventCode) {
case NSStreamEventHasBytesAvailable:
//read from input stream
NSArray * data = read_InputStream;
[subscriber sendNext:data];
break;
}
...
}
当我在回调方法中接收到数据时,我必须存储订阅者的值并在其上调用 sendNext。
有没有更好的方法在 ReactiveCocoa 中处理这个问题并避免声明订阅者属性。此外,这不适用于多个订阅者。
最佳答案
您可以使用 rac_signalForSelector
将委托(delegate)回调方法转换为信号。然后您可以在 createSignal
的 didSubscribe
block 中订阅此信号。像这样:
- (RACSignal*)connect:(NSString *)url
{
return [RACSignal createSignal:^RACDisposable*(id<RACSubscriber> theSubscriber)
{
// create inputStream and outputStream, initialize and open them
[self.inputStream open];
[self.outputStream open];
[[self rac_signalForSelector:@selector(stream:handleEvent:)
fromProtocol:@protocol(NSStreamDelegate)]
subscribeNext:^(RACTuple *tuple)
{
NSStream *aStream = (NSStream *)tuple.first;
NSStreamEvent *eventCode = (NSStreamEvent *)tuple.second;
// check eventCode here
NSArray *data = read_InputStream;
[theSubscriber sendNext:data];
}];
return nil;
}];
}
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
}
使用 rac_signalForSelector
时,信号会将来自方法的参数作为元组传递,然后您可以查看元组以决定采取什么操作。
根据您在此尝试实现的目标,可能有更优雅的响应式解决方案,但 rac_signalForSelector
至少解决了需要订阅者属性的问题。
关于ios - ReactiveCocoa : sendNext to a subscriber in asynchronous programming,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683280/