首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSInvocationOperation忽略maxConcurrentOperationCount

NSInvocationOperation忽略maxConcurrentOperationCount
EN

Stack Overflow用户
提问于 2011-12-31 02:53:58
回答 1查看 804关注 0票数 0

我正在尝试使用NSInvocationOperation对一些TWRequest调用进行排队。它似乎以正确的顺序添加了方法调用,但doSomething:方法几乎同时被调用,即并发运行,而不是一个接一个地运行,这正是我想要实现的。

此外,complete的顺序错误,这表明它不是一个接一个地运行...

代码语言:javascript
复制
- (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);
         });
     }];
}

在日志中,我看到以下内容:

代码语言:javascript
复制
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)完成后执行请求...有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-31 03:31:52

操作队列工作正常。正如@Joe在评论中所说,performRequestWithHandler:启动异步连接并立即返回。您可以通过在doSomething末尾添加一个NSLog来查看,如下所示:

代码语言:javascript
复制
- (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直接用于串行分派队列。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8682904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档