NSUrlConnection в нескольких экземплярах NSOperation в NSOperationQueue - PullRequest
3 голосов
/ 15 апреля 2011

Следующий код добавляет несколько экземпляров 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

1 Ответ

0 голосов
/ 25 апреля 2011

Когда вы включили sleepForTimeInterval , он приостанавливается дольше, чем требуется для завершения операции NSO. Поэтому на самом деле за один раз происходит только одна параллельная операция.

Когда у вас отключено sleepForTimeInterval , вы представляете NSOperationQueue с несколькими параллельными операциями для завершения.

Что у вас установлено [NSoperationQueue setMaxConcurrentOperationCount]? Я бы установил 15, чтобы все операции выполнялись параллельно. Я думаю, что, возможно, операции находятся в очереди в данный момент и, следовательно, не все работают параллельно.

...