我是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属性。
所以我想问题是如何避免多次绑定属性,但仍然可以使用创建的信号来调用方法?
答案 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)]];
}