Следующий код добавляет несколько экземпляров NSOperation в NSOperationQueue.Операция просто берет содержимое 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 witch -requestResponse:
<?php
echo "Through!";
for($i=0;$i<1000000;$i++) { // don't return too soon
}
?>
Проблема в том, что когда я использую [NSThread sleepForTimeInterval:1.0]
для создания задержки перед каждым добавлением NSOperation в очередь, все запросы выполняются примерно в одно и то же время.Если я прокомментирую эту строку, большинство запросов будут занимать значительно все больше все больше и больше времени для выполнения.Вопрос почему?
Я проверил URL-адрес из командной строки (используя curl), и запросы выполняются в одно и то же время для любого количества одновременных вызовов 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
// конечно, различия намного больше (от 7 до 20 секунд!), Когда PHP делает некоторыенастоящая работа.
и с включенным 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