NSInvocationOperation игнорирует maxConcurrentOperationCount - PullRequest
0 голосов
/ 30 декабря 2011

Я пытаюсь поставить в очередь некоторые вызовы TWRequest, используя NSInvocationOperation. Кажется, что добавляются вызовы методов в правильном порядке, но методы doSomething: методы вызываются в то же самое время, то есть выполняются одновременно, а не один за другим, чего я и хочу достичь.

Кроме того, все выполнено в неправильном порядке, что говорит о том, что он не работает один за другим ...

- (void)prepare {

    if(!self.queue){
        self.queue = [[NSOperationQueue alloc] init];
        [self.queue setMaxConcurrentOperationCount:1];
    }

    for(NSString *text in calls){

        NSLog(@"Adding to Queue... %@", text);
        NSInvocationOperation *indexOperation = [[NSInvocationOperation alloc] initWithTarget:self  
                                                                                     selector:@selector(doSomething:) object:text];
        [self.queue addOperation:indexOperation];
    }     
}

- (void)doSomething:(NSString*)someText {

    TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://something.com"] parameters:nil requestMethod:TWRequestMethodGET];
    NSLog(@"About to Perform Request... %@", someText);
    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
     {
         dispatch_sync(dispatch_get_main_queue(), ^{
              // works fine
              NSLog(@"Network Finished... %@", someText);
         });
     }];
}

В логе вижу это:

2011-12-30 18:34:34.553 app[32745:10703] Adding to Queue... 1
2011-12-30 18:34:34.555 app[32745:10703] Adding to Queue... 2
2011-12-30 18:34:34.556 app[32745:10703] Adding to Queue... 3
2011-12-30 18:34:34.557 app[32745:13e03] About to Perform Request... 1
2011-12-30 18:34:34.560 app[32745:13e03] About to Perform Request... 2
2011-12-30 18:34:34.563 app[32745:13e03] About to Perform Request... 3
2011-12-30 18:34:35.303 app[32745:10703] Network finished... 3
2011-12-30 18:34:35.454 app[32745:10703] Network finished... 2
2011-12-30 18:34:35.601 app[32745:10703] Network finished... 1

Я ожидаю увидеть (2), чтобы выполнить запрос после того, как (1) закончил и т. Д ... Есть указатели?

1 Ответ

4 голосов
/ 30 декабря 2011

Очередь операций работает нормально. Как сказал @Joe в комментарии, performRequestWithHandler: запускает асинхронное соединение и немедленно возвращается. Вы можете увидеть это, добавив NSLog к концу doSomething следующим образом:

- (void)doSomething:(NSString*)someText {
    TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://something.com"] parameters:nil requestMethod:TWRequestMethodGET];
    NSLog(@"About to Perform Request... %@", someText);
    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
     {
         dispatch_sync(dispatch_get_main_queue(), ^{
              // works fine
              NSLog(@"Network Finished... %@", someText);
         });
     }];
    NSLog(@"doSomething Finished");
}

Чтобы каждый запрос выполнялся последовательно, вам нужно либо сделать запрос синхронным внутри операции (используйте метод signedRequest и синхронное NSURLConnection), либо не использовать очередь операций и вызывать следующий запрос в обработчике завершения текущий запрос. Имейте в виду, что если вы используете очередь операций, порядок выполнения операций не зависит от порядка их добавления. Вы можете рассмотреть возможность использования GCD напрямую с очередью последовательной отправки.

...