Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ReactiveCocoa:在异步编程中,在订阅服务器旁边发送_Ios_Reactive Cocoa - Fatal编程技术网

Ios ReactiveCocoa:在异步编程中,在订阅服务器旁边发送

Ios ReactiveCocoa:在异步编程中,在订阅服务器旁边发送,ios,reactive-cocoa,Ios,Reactive Cocoa,我正在尝试使用NSInputStream和NSOutputStream将ReactiveCoCoCoCA用于网络连接。连接代码如下所示: -(RACSignal*) connect: (NSString *) url { return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> theSubscriber) { self.subscriber = theSubscriber;

我正在尝试使用NSInputStream和NSOutputStream将ReactiveCoCoCoCA用于网络连接。连接代码如下所示:

-(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;
   }
   ...
 }
-(RACSignal*)连接:(NSString*)url{
return[RACSignal createSignal:^RACDisposable*(订阅方id){
self.subscriber=订阅方;
//创建inputStream和outputStream,初始化并打开它们
[self.inputStream打开]
[self.outputStream open];
}];
返回零;
}
-(void)流:(NSStream*)aStream handleEvent:(NSStreamEvent)事件代码{
开关(事件代码){
案例NSTRAVENTHASBYTES可用:
//从输入流读取
NSArray*数据=读取\输入流;
[订户发送下一步:数据];
打破
}
...
}
当我在回调方法中接收数据时,我必须存储subscriber的值并调用sendNext


是否有更好的方法在ReactiveCocoa中处理此问题并避免声明订阅服务器属性。此外,这不适用于多个订阅者。

您可以使用rac\u signalForSelector将委托回调方法转换为信号。然后您可以在
createSignal
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
{
}
-(RACSignal*)连接:(NSString*)url
{
return[RACSignal createSignal:^RACDisposable*(订阅方id)
{
//创建inputStream和outputStream,初始化并打开它们
[self.inputStream open];
[self.outputStream open];
[[self rac_signalForSelector:@selector(流:handleEvent:)
fromProtocol:@协议(NSStreamDelegate)]
subscribeNext:^(RACTuple*元组)
{
NSStream*aStream=(NSStream*)tuple.first;
NSStreamEvent*事件代码=(NSStreamEvent*)tuple.second;
//在此处检查事件代码
NSArray*数据=读取\输入流;
[订阅方发送下一步:数据];
}];
返回零;
}];
}
-(void)流:(NSStream*)aStream handleEvent:(NSStreamEvent)事件代码
{
}
使用
rac\u signalForSelector
时,信号将把方法中的参数作为元组传递,然后您可以查看元组以决定要采取的操作


根据您在这里试图实现的目标,可能有更优雅的反应式解决方案,但是
rac\u signalForSelector
至少解决了需要订户属性的问题

非常感谢!这很有帮助