我正在尝试使用NSInputStream&amp ;;来使用ReactiveCococa进行网络连接。 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中处理此问题并避免声明订阅者属性。此外,这不适用于多个订阅者。
答案 0 :(得分:1)
您可以使用rac_signalForSelector
将委托回调方法转换为信号。然后,您可以在createSignal
的{{1}}块内订阅此信号。像这样:
didSubscribe
使用- (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
至少解决了需要订户属性的问题。