以下代码在NSOperationQueue中添加了多个NSOperation实例。该操作仅采用URL的内容。我也提供php代码...

给定以下代码...

-(void)requestResponse {

    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.someurl.gr/test.php"] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:40.0];

    NSDate *dd = [NSDate date];

    NSURLResponse *resp;
    NSData *returnedData = [NSURLConnection sendSynchronousRequest:req returningResponse:&resp error:NULL];

    NSString *ss = [[[NSString alloc] initWithData:returnedData encoding:NSUTF8StringEncoding] autorelease];

    NSLog(@"%@ - %.2f",ss , -[dd timeIntervalSinceNow]);

}


-(NSOperation*)task {
    NSInvocationOperation* theOp = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(requestResponse) object:nil] autorelease];
    return theOp;
}


-(IBAction)buttonAction:(id)sender {

    NSOperationQueue *opq = [[NSOperationQueue alloc] init];
    [opq setMaxConcurrentOperationCount:40];

    for(int i=0; i<15;i++) {
        [opq addOperation:[self task]];
        [NSThread sleepForTimeInterval:1.0]; // here is the issue!
    }

    [opq release];
}

test.php女巫-requestResponse调用的内容:
<?php
    echo "Through!";
    for($i=0;$i<1000000;$i++) { // don't return too soon
    }
?>

问题是,当我使用[NSThread sleepForTimeInterval:1.0]在队列中每个NSOperation添加之前创建一个延迟时,所有请求大约需要相同的时间才能完成。如果我对此行发表评论,大多数请求将花费越来越多,越来越多,需要更多时间来完成。问题是为什么?

我已经从命令行(使用curl)测试了该url,并且请求同时完成了对php的任意数量的请求,因此问题不在服务器端。

这是使用localhost作为服务器的输出,其中sleepForTimeInterval禁用了
[s] Through! - 0.22
[s] Through! - 0.23
[s] Through! - 0.25
[s] Through! - 0.26
[s] Through! - 0.26
[s] Through! - 0.28
[s] Through! - 0.43
[s] Through! - 0.46
[s] Through! - 0.49
[s] Through! - 0.50
[s] Through! - 0.52
[s] Through! - 0.51
[s] Through! - 0.60
[s] Through! - 0.62
[s] Through! - 0.63

//当然,使用php进行实际工作时,差异会更高(从7到20秒!)。

并启用 sleepForTimeInterval并启用
[s] Through! - 0.23
[s] Through! - 0.09
[s] Through! - 0.09
[s] Through! - 0.09
[s] Through! - 0.09
[s] Through! - 0.09
[s] Through! - 0.08
[s] Through! - 0.09
[s] Through! - 0.09
[s] Through! - 0.08
[s] Through! - 0.09
[s] Through! - 0.09
[s] Through! - 0.09
[s] Through! - 0.09
[s] Through! - 0.09

最佳答案

启用 sleepForTimeInterval 后,它会暂停更长的时间,然后NSOperation需要完成。因此,您实际上一次只发生一个并发操作。

当禁用 sleepForTimeInterval 时,您将向NSOperationQueue展示要完成的多个并行操作。

您将[NSoperationQueue setMaxConcurrentOperationCount]设置为什么?我会确保将其设置为15,以允许所有操作并行完成。我在想,也许这些操作目前正在排队,因此并非所有并行操作。

关于objective-c - NSOperationQueue中的多个NSOperation实例中的NSUrlConnection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5679836/

10-12 01:49