我正在处理使用AFNetworking和Reactive Cocoa处理对Web服务的多个请求的方式。在这种情况下,用户要求API为字符/整数搜索输入提供一堆建议,以便从列表中选择一个城市。
这是我的代码:
首先是用户输入超过3个字符/整数
时执行的方法- (void)fetchData:(NSString *)searchText
{
NSLog(@"%@", searchText);
if ([searchText validateStringwithPattern:BKPostcodeRegEx]) {
self.searchURL = [NSString stringWithFormat:@"%@location/postalCode/%@/%@", BKBaseURL, self.countryCode, searchText];
} else if ([searchText validateStringwithPattern:BKCityRegEx]) {
self.searchURL = [NSString stringWithFormat:@"%@location/city/%@/%@", BKBaseURL, self.countryCode, searchText];
} else {
NSLog(@"Error Alert - No Valid Input");
return;
}
RAC(self, searchResults) = [[[self postRequest] map:^(NSDictionary *json) {
NSArray *results = json[@"data"][@"locations"];
return results;
}] catch:^(NSError *error) {
return [RACSignal return:@[]];
}];
}
现在,这是我实际创建信号并将其传递回self.searchResults
:
- (RACSignal *)postRequest
{
return [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[self.requestOperationManager GET:self.searchURL parameters:self.params success:^(AFHTTPRequestOperation *operation, id responseObject) {
[subscriber sendNext:responseObject];
[subscriber sendCompleted];
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[subscriber sendError:error];
}];
return [RACDisposable disposableWithBlock:^{
[self.requestOperationManager.operationQueue cancelAllOperations];
}];
}] doError:^(NSError *error) {
NSLog(@"error: %@", [error description]);
}] throttle:0.5];
}
我认为问题是,我在当前信号完成之前的信号之前开始订阅信号,因此在我尝试再次订阅时引起异常。
* 由于未捕获的异常终止应用程序&#39; NSInternalInconsistencyException&#39;,原因:&#39;信号名称:[[[[[createSignal:] -doError:] -throttle: 0.500000] -map:] -catch:已绑定到关键路径&#34; searchResults&#34;对象,添加信号 name:[[[[+ createSignal:] -doError:] -throttle:0.500000] -map:] -catch:是未定义的行为&#39;
我的猜测是我必须在postRequest方法中尝试这样的东西,但这似乎没有开箱即用:
if (self.requestOperationManager.operationQueue.operationCount == 1) {
NSLog(@"cancel all operations");
[self.requestOperationManager.operationQueue cancelAllOperations];
[subscriber sendCompleted];
}
答案 0 :(得分:2)
您只能在任何给定对象的关键路径上调用RAC()
一次。看起来-fetchData:
可以多次调用,这将导致RAC()
在同一对象和关键路径上被多次调用。
通常,您在某种设置方法(例如初始化程序或RAC()
)中调用-[UIViewController loadView]
,以便只调用一次。不要等到用户键入超过3个字符,然后调用-fetchData:
,而是考虑如何在用户输入超过3个字符时创建发送值的信号,并将该信号分配给{{1 '}属性。例如(完全未经测试):
RAC()