ios - ReactiveCocoa : sendNext to a subscriber in asynchronous programming

标签 ios reactive-cocoa

我正在尝试使用 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)回调方法转换为信号。然后您可以在 createSignaldidSubscribe 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/

相关文章:

javascript - 打开应用程序时自动启用蓝牙可发现性?

ios - 当使用逗号而不是小数点时,我的 iOS 应用程序会计算数字吗?

ios - 在用户选择时动态删除自定义 UIView/在 ios swift 中突出显示

ios - 设置 NSStreams 的正确方法?

iOS MVVM 处理初始 View 状态

swift2 - 类型 'Error' 约束为非协议(protocol)类型,即使类型是协议(protocol)

iphone - 在 iOS sdk 中实现 adColony 时出错

ios - ReactiveCocoa 4,根据 UI 事件和验证正确发送我的 HTTP 请求

ios - 如何从 ReactiveCocoa 信号中获取 "old value"?

ios - UITextField 获得焦点,然后由于在 textFieldShouldReturn 中返回 YES 而立即失去焦点