2016-04-27 8 views
0

Ich habe eine verschachtelte Schleife des Sendens der Anfrage.NSURLConnection senden Anfrage nach Abschluss aller Prozess

-(void) download 
{ 
    for(NSString *id in array) 
    { 
    //init with request and start the connection 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request deletegate:self]; 
    [conn start]; 
    } 
} 

-(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) data 
{ 
//enter here secondly 
} 
-(void) connectionDidFinishLoading:(NSURLConnection *) connection 
{ 
//enter here last, after finish the for loop 
//my intention is use the downloaded data to do something before sending a new request. 
} 

Das Problem ist, dass ich "-(void) connectionDidFinishLoading:(NSURLConnection *) connection" zuerst, bevor die Anfrage senden wieder in der for-Schleife eingeben möchten.

Aber im Moment wird die for-Schleife beendet und alle Anfragen vor der Eingabe an "-(void) connectionDidFinishLoading:(NSURLConnection *) connection" gesendet.

+1

[NSURLConnection sendSynchronousRequest: Anfrage returningResponse: Antwortfehler: nil] –

+0

Sie können NSOperationQueue mit addDependency oder MaxConcurrentOperation verwenden. –

+0

@PKT Ich denke, Ihre Lösung ist genug für mich. Danke – user1151874

Antwort

1

sollten Sie versuchen, diese NSURLConnection in iOS9

for (NSString *URL in URLArray) { 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; 

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    // check error and/or handle response here 
}]; 
[task resume]; 
} 

und verwenden dispatch_group_t group = dispatch_group_create();

Add Linie für Schleife dispatch_group_enter(group); für Ihr Ziel nennen

dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    // Request Finish 
}); 

veraltet ist

0

In Ihrem Fall müssen Sie die Blockfunktion versuchen, da Sie gemäß Ihrer Anforderung die Antwort der ersten Verbindung für eine andere Anfrage erhalten möchten.

for(NSString* url in array) 
{ 
    // Generate a NSURLRequest object from the address of the API. 
    NSURL *url = [NSURL URLWithString:urlLink]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    // Send the request asynchronous request using block! 
    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue mainQueue] 
          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

          if (error) { 
           NSLog(@"Error in updateInfoFromServer: %@ %@", error, [error localizedDescription]); 
          } else if (!response) { 
           NSLog(@"Could not reach server!"); 
          } else if (!data) { 
           NSLog(@"Server did not return any data!"); 
          } else { 
           [self doStuffWithData:data]; 
          } 
         }]; 
} 
0

URL Laden ist kein Synchronbetrieb (oder zumindest sollte niemals synchron durchgeführt werden), weil es nur für einen DNS-Lookup-Fehler bis 90 Sekunden dauern kann, und fast unendlich lang, wenn der Server tröpfelt aus hält Daten. Wenn du den Hauptthread nur für einen Bruchteil dieser Zeit blockierst, wird iOS deine App beenden.

Anstatt die Anforderungen in einer Schleife zu terminieren und darauf zu warten, dass sie beendet werden, müssen Sie die erste Anfrage planen (und nur die erste Anfrage). Dann, in Ihrer connectionDidFinishLoading: Methode (und vielleicht Ihre connection:DidFailWithError: Methode), planen Sie die nächste Anfrage.

Mit dem gesagt, wenn Sie noch iOS 6/10.8 und früher unterstützen müssen, sollten Sie wahrscheinlich NSURLSession verwenden. (Derselbe allgemeine Hinweis gilt auch für die Namen der Delegiertenmethoden, um die Schuldigen zu schützen.)

Verwandte Themen