Objective-C - ASINetworkQueue выполняет добавленные запросы дважды? - PullRequest
1 голос
/ 05 августа 2011

Я использую ASINetworkQueue для постановки своих запросов в очередь. Принимая во внимание, что я добавляю 12 запросов, в итоге он загружается 24 раза, загружая каждый запрос дважды? Это почему? И как я могу предотвратить это?

Перед вызовом перейти в очередь. Я проверяю, сколько запросов было добавлено в очередь (NSLog(@"%@",[[self queue] operations]);), и отображается 12 запросов ASIHTTP.

РЕДАКТИРОВАТЬ : Добавлен мой код. У меня не включен точный прогресс.

Код:

- (void)setupQueue {

    DLog(@"setupQueue running");

    // Stop anything already in the queue before removing it
    [[self queue] cancelAllOperations];

    // Creating a new queue each time we use it means we don't have to worry about clearing delegates or resetting progress tracking
    [self setQueue:[ASINetworkQueue queue]];
    [[self queue] setDelegate:self];

    [[self queue] setRequestDidStartSelector:@selector(requestStarted:)];
    [[self queue] setRequestDidFinishSelector:@selector(requestFinished:)];
    [[self queue] setRequestDidFailSelector:@selector(requestFailed:)];
    [[self queue] setQueueDidFinishSelector:@selector(queueFinished:)];

}

- (NSArray *)parseMapsThumbsUrls {

    DLog(@"parseMapsThumbsUrls running");

    NSDictionary *results = [[self officesJSON] JSONValue];

    NSArray *offices = [results objectForKey:@"offices"];

    NSMutableArray *mapsThumbsUrls = [[[NSMutableArray alloc] init] autorelease];

    for (NSDictionary *office in offices) {

        NSString *mapThumbImageString = [NSString stringWithFormat:@"http://maps.google.com/maps/api/staticmap?zoom=11&markers=color:0xFF7300|%@,%@&size=70x70&sensor=true", [office objectForKey:@"latitude"], [office objectForKey:@"longitude"]];

        // Make the string HTML-compatible
        NSString *url = [mapThumbImageString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        [mapsThumbsUrls addObject:url];

    }

    return mapsThumbsUrls; // returns an array of 6 urls
}

- (void)downloadMapsThumbs {

    DLog(@"downloadMapsThumbs running");

    [self setupQueue]; 

    NSArray *mapsThumbsUrls = [self parseMapsThumbsUrls];

    for (NSString *mapThumbUrl in mapsThumbsUrls) {

        NSURL *url = [NSURL URLWithString:mapThumbUrl];
        ASIHTTPRequest *mapThumbRequest = [ASIHTTPRequest requestWithURL:url];

        [mapThumbRequest setTag:2];

        [mapThumbRequest setDelegate:self];

        [[self queue] addOperation:mapThumbRequest];
    }
}

- (void)download {

    [self downloadMapsThumbs];

    DLog(@"%@",[[self queue] operations]);
    [[self queue] go];
}

- (void)requestFinished:(ASIHTTPRequest *)request {


    if (request.tag == 2) { // Process thumbs

        DLog(@"%@",[[request originalURL] description]);

        // Use when fetching binary data
        NSData *responseData = [request responseData];
        [[self mapThumbs] addObject:responseData];

    }

}

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

Я заметил, что я устанавливаю делегата как для очереди, так и для отдельных запросов, поэтому запросы загружаются дважды.

1 голос
/ 05 августа 2011

Чтобы процитировать документы:

Когда вы запускаете очередь с включенным точным прогрессом, он сначала выполняет запрос HEAD для всех запросов GET в очереди, чтобы получить общий размерданные для загрузки.Как только он имеет общий размер, он может точно показать общий прогресс, и реальные запросы начнутся.

Это приведет к двум HTTP-запросам для каждой записи в очереди, поэтому, возможно, объясняется, чтоты видишь?

...