0

NSInvocationOperationを使用していくつかのTWRequest呼び出しをキューに入れようとしています。メソッド呼び出しを正しい順序で追加するようですが、doSomething:メソッドは同時に呼び出されます。つまり、同時に実行するのではなく、同時に実行します。これは達成したいものです。NSInvocationOperationがmaxConcurrentOperationCountを無視しています

また

、それが次々...私はこれを参照してくださいログで

- (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)...すべてのポインタ?

+1

非同期ネットワークコールの結果に基づいて動作していないとは言えません。 – Joe

答えて

4

操作キューが正常に動作しています。 @JoeはコメントでperformRequestWithHandler:が非同期接続を開始してすぐに戻ると述べています。あなたは次のようにdoSomethingの最後にNSLogを追加することで、これを見ることができます:

- (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を直接使用することを検討するかもしれません。

+0

ありがとうございました...私は、完了ハンドラで次のリクエストを呼び出すオプションに行ってきました。 – mootymoots

関連する問題