Reactive Cocoa和多个AFNetworking请求在短时间内

时间:2014-04-14 11:58:03

标签: ios afnetworking afnetworking-2 reactive-cocoa

我正在处理使用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];
}

1 个答案:

答案 0 :(得分:2)

您只能在任何给定对象的关键路径上调用RAC()一次。看起来-fetchData:可以多次调用,这将导致RAC()在同一对象和关键路径上被多次调用。

通常,您在某种设置方法(例如初始化程序或RAC())中调用-[UIViewController loadView],以便只调用一次。不要等到用户键入超过3个字符,然后调用-fetchData:,而是考虑如何在用户输入超过3个字符时创建发送值的信号,并将该信号分配给{{1 '}属性。例如(完全未经测试):

RAC()