ReactiveCocoa:sendNext在异步编程中发送给订阅者

时间:2014-10-31 20:55:36

标签: ios reactive-cocoa

我正在尝试使用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中处理此问题并避免声明订阅者属性。此外,这不适用于多个订阅者。

1 个答案:

答案 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至少解决了需要订户属性的问题。