2011-08-04 1 views
1

ASINetworkQueue를 사용하여 요청을 대기열에 넣습니다. 12 개의 요청을 추가하는 반면, 결국에는 24 번 다운로드하여 각 요청을 두 번 다운로드합니까? 왜 그런가요? 어떻게 그것을 막을 수 있습니까?Objective-C - ASINetworkQueue가 추가 된 요청을 두 번 실행합니까?

대기열에서 전화를 걸기 전에 대기열에 추가 된 요청 수 (예 : (NSLog(@"%@",[[self queue] operations]);))를 확인하고 12 개의 ASIHTTPRequests를 표시합니다.

수정 : 내 코드가 추가되었습니다. 정확한 진도가 켜지지 않았습니다.

코드 :

- (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

몇 가지 코드를 보여주십시오. – VenoMKO

+0

관련 코드를 추가했습니다. 감사. –

답변

2

대기열과 개별 요청에 대한 위임자를 설정 했으므로 요청이 두 번 다운로드되는 것입니다.

1

인용하려면 문서 : 당신이 켜져 정확한 진행 큐를 시작하면

는, 먼저 큐에있는 모든 GET 요청에 대한 HEAD 요청을 수행합니다 다운로드 할 데이터의 전체 크기를 가져옵니다. 전체 크기가되면 전체 진행률을 정확하게 표시 할 수 있으며 실제 요청이 시작됩니다.

이렇게하면 대기열의 모든 항목에 대해 두 개의 HTTP 요청이 발생하므로보고있는 내용을 설명 할 수 있습니다.

관련 문제