我正在尝试使用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)执行请求等...任何指针?
答案 0 :(得分: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串行调度队列。