Ios ReactiveCocoa:在异步编程中,在订阅服务器旁边发送
我正在尝试使用NSInputStream和NSOutputStream将ReactiveCoCoCoCA用于网络连接。连接代码如下所示: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;
-(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
至少解决了需要订户属性的问题 非常感谢!这很有帮助