信号已经绑定到关键路径

时间:2014-04-04 17:19:49

标签: ios reactive-cocoa

我是RAC的新手并遇到以下问题。

我将对象的NSArray属性绑定到一个信号,该信号从这样的Web服务中获取一些json有效负载:

- (void)updateRandomUserData
{
    RAC(self, users) = [[[self fetchRandomUserData] map:^(NSDictionary *json) {
        NSMutableArray *randomUsers = [NSMutableArray array];
        for (NSDictionary *dict in json[@"data"]) {
            BKRandomUser *randomUser = [MTLJSONAdapter modelOfClass:[BKRandomUser class] fromJSONDictionary:dict error:nil];
            [randomUsers addObject:randomUser];
        }
        return randomUsers;
    }] catch:^(NSError *error) {
        return [RACSignal return:@[]];
    }];
}

当我从正确的视图控制器的viewDidLoad调用它时,我发现这是有意为的:

[[[RACObserve(self.randomUserManager, users) deliverOn:RACScheduler.mainThreadScheduler] filter:^BOOL(NSArray *users) {
            return users.count > 0;
        }] subscribeNext:^(NSArray *newUsers) {
            @strongify(self);
            self.loggedOutDataSource.items = newUsers;
            if (self.refreshControl.refreshing) {
                [self.refreshControl endRefreshing];
            }
            [self.tableView reloadData];
        }];

        [self.randomUserManager updateRandomUserData];

但是当我想在视图控制器的生命周期中稍后调用[self.randomUserManager reloadManager]时,我会发生崩溃说:

  

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'信号名称:[[[+ createSignal:] -doError:] - map:] -catch:已绑定到密钥对象上的路径“users”,添加信号名称:[[[+ createSignal:] -doError:] - map:] -catch:is undefined behavior'

我认为问题在于,当调用[self.randomUserManager updateRandomUserData]时,它试图再次绑定NSArray属性。

所以我想问题是如何避免多次绑定属性,但仍然可以使用创建的信号来调用方法?

2 个答案:

答案 0 :(得分:2)

问题是我没有致电[subscriber setCompleted]来终止订阅。

答案 1 :(得分:0)

在调用选择器之前尝试取消订阅:

- (void)updateRandomUserData
{
    RAC(self, users) = [[[[self fetchRandomUserData] map:^(NSDictionary *json) {
       NSMutableArray *randomUsers = [NSMutableArray array];
       for (NSDictionary *dict in json[@"data"]) {
            BKRandomUser *randomUser = [MTLJSONAdapter modelOfClass:[BKRandomUser class] fromJSONDictionary:dict error:nil];
                [randomUsers addObject:randomUser];
            }
        return randomUsers;
    }] catch:^(NSError *error) {
        return [RACSignal return:@[]];
    }] takeUntil:[self rac_signalForSelector:@selector(updateRandomUserData)]];
}