了解RACSubject

时间:2016-02-14 08:21:44

标签: objective-c reactive-cocoa

我正在研究Reactive Cocoa,我想知道为什么以后不能工作:

在B级我声明:

+(RACSubject*)importText{

    RACSubject *subject = [RACSubject subject];


    //1 block

    NSArray *testArray = @[@"1",@"2",@"3"];

    //2 block

    [subject sendNext:[[[testArray rac_sequence] map:^id(NSString* value) {

        return [value stringByAppendingString:@"More"];
    }] array]];



    return subject;
}

在A班:

 [[SecondObject importText] subscribeNext:^(id x) {

       NSLog(@"Output is %@", x);
   }];

但是,控制台中没有任何输出。为什么呢?

1 个答案:

答案 0 :(得分:1)

仔细研究importText方法的作用。您首先创建了一个主题和临时数组。然后在任何其他事情发生之前,你只需要调用sendNext:...来发送你临时创建的值但是还没有其他人没有订阅这个主题。最后,您的importText方法返回SecondObject将获得的主题,然后订阅它。

@interface SomeClass
@property (nonatomic, strong) RACSubject *subject;
@end

@implementation SomeClass
- (id)init
{
    self = [super init];
    if(self) {
        self.subject = [RACSubject subject];
    }
}

- (RACSubject *)rac_signalForImportText
{
    return self.subject;
}

- (void)importText
{
    NSArray *testArray = @[@"1",@"2",@"3"];

    //2 block

    [subject sendNext:[[[testArray rac_sequence] map:^id(NSString* value) {

        return [value stringByAppendingString:@"More"];
    }] array]];
}



SomeClass* Second = [SomeClass alloc] init];
[[Second rac_signalForImportText] subscribeNext:^(id x) {
     NSLog(@"Output is %@", x);
}];
[Second importText];

我不确定为什么要以这种方式使用主题,但是在rac_signalForImportText方法调用之前不会调用通知importText,因为这是我使用主题调用的地方{ {1}}会触发sendNext订阅的任何人。希望这有帮助。