0

NSInvocationOperation を使用して、いくつかの TWRequest 呼び出しをキューに入れようとしています。メソッド呼び出しを正しい順序で追加しているように見えますが、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

(1)が終了した後に(2)リクエストを実行することを期待しています...何かポインタはありますか?

4

1 に答える 1

4

操作キューは正常に機能しています。@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 を直接使用することを検討してください。

于 2011-12-30T19:31:52.130 に答える