2010-06-20 5 views

Antwort

15

Nein, tut es nicht.

Um Daten von URL asynchron zu erhalten, sollten Sie die NSURLRequest und NSURLConnection Ansatz verwenden.

Sie werden die NSURLConnectionDelegate Methoden implementieren:

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection; 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 
+1

Dieser Beitrag zeigt ein Beispiel dafür, wie 'verwenden + dataWithContentsOfURL:' auf einem Hintergrund-Thread das gleiche Ergebnis zu erzielen: http://londonwebdev.com/2011/01/13/retrieving-remote-images- on-background-threads-on-the-iphone/ – user8472

+0

Natürlich! Alles kann in einem Hintergrundthread gemacht werden, aber es war nicht die Frage. Darüber hinaus würde ich das gleiche mit NSOperationQueue tun, als es in dem Beitrag, den Sie erwähnt haben, implementiert ... –

+1

@ user8472, Lesen Sie die Frage und die Antwort noch einmal ... Die Methode 'dataWithContentsOfURL' wird nicht ausgeführt Hintergrund für sich. Offensichtlich können Sie alles (fast) im Hintergrundthread ausführen. Sie haben viele Möglichkeiten - nicht nur die, die ich vorgeschlagen habe (was die parallele Lösung zu "dataWithContentsOfURL" ist). Sie könnten es auch mit 'performSelectorInBackground ...', 'NSOperation' +' NSOperationQueue', Blöcken (wie Sie erwähnt haben) und wenigen anderen Möglichkeiten ... Die untere Zeile - es gibt keinen Konflikt in meiner Antwort. –

4

Nein, es blockiert den aktuellen Thread.

Sie müssen NSURLConnection verwenden, um asynchrone Anforderungen zu haben.

3

Auch Sie können verwenden -dataWithContentsOfURL + NSOperation + NSOperationQueue

7

Ich verwende dataWithContentsOfURL in einem Hintergrund-Thread in Ordnung.

-(void)loaddata { 
    NSData* data = [NSData dataWithContentsOfURL:@"some url"]; 
    if (data == nil) { 
     DLog(@"Could not load data from url: %@", url); 
     return; 
    } 
} 

Rufen Sie so etwas aus dem Hauptthread.

[self performSelectorInBackground:@selector(loaddata) withObject:nil]; 

Wenn Sie die Durchführung von Aktualisierungen am Ende des Loaddata auf ui, sollten Sie eine Funktion auf Hauptthread nennen.

0

Nein, dies wird den Thread blockieren und Sie werden den Inhalt der Datei in den RAM laden. Sie können Inhalte direkt in Dateien ohne temporäre NSData herunterladen, um eine enorme RAM-Nutzung zu vermeiden. So etwas wie diese Lösung https://stackoverflow.com/a/6215458/2937913

1

Ich vermute, das hat sich ein bisschen im Laufe der Jahre verändert. Aber in diesen Tagen,

NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]]; 
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) { 
}]; 

wird Ihnen einen asynchronen Netzwerkanruf geben.

4

Nein. Sie können stattdessen NSURLSession verwenden.

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 

NSString *imageURL = @"Direct link to your download"; 

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; 

NSURLSessionDownloadTask *getImageTask = [session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]]; 
    }); 
}]; 
[getImageTask resume];