3 Stimmen

Ziel - C Herunterladen von Bildern aus dem Web Problem

Ich habe diesen Code, den ich zum Herunterladen von Bildern von einem Server verwende:

- (void) loadDataWithOperation {

//Verbindungstest
NSURL *url = [NSURL URLWithString:@"http://myurl.com/testconnection.php"];
NSError* error; 
NSString* connected = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&error];

//Wenn der String Connected nicht in der Lage war, sich mit den Inhalten der URL zu initialisieren:
if (connected == NULL) {
    //Fehlerbild anzeigen:

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Fehler!" message:@"Fehler beim Herunterladen der Galerie, bitte überprüfen Sie die Netzwerkverbindung und versuchen Sie es erneut."  delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];
    [alert release];

    [self createBackButton];

} else {
    //Daten laden
    NSLog(@"Verbunden - %@",connected);

    NSLog(@"loadDataWithOperartion");
    //Ein Array zum Speichern der URLs erstellen
    NSMutableArray *myURLS;

    //Das Array mit nil initialisieren
    myURLS = [[NSMutableArray alloc] init];

    NSLog(@"Hier1");
    //Alle URLs vom Server dem Array hinzufügen
    for (int i = 0; i <= 4; i++){
        NSString *tempString = [[NSString alloc] initWithFormat : @"http://myurl.com/GalleryImages/%djack1.jpg", i];
        [myURLS addObject: [NSURL URLWithString:tempString]];
        [tempString release];
    }

    //Array zum Speichern der Bilddaten
    NSMutableArray *myData;

    //Das Array mit nil initialisieren
    myData = [[NSMutableArray alloc] init];

    NSLog(@"Hier2");
    //Alle URLs vom Server dem Array hinzufügen
    for (int i = 0; i <= 4; i++){
        [myData addObject: [[NSData alloc] initWithContentsOfURL: [myURLS objectAtIndex:i]]];
    }

    //Array zum Speichern der Bilddaten
    NSMutableArray *myImages;

    //Das Array mit nil initialisieren
    myImages = [[NSMutableArray alloc] init];

    NSLog(@"Hier3");
    //Alle URLs vom Server dem Array hinzufügen
    for (int i = 0; i <= 4; i++){
        [myImages addObject: [UIImage imageWithData: [myData objectAtIndex:i]]];
    }

    // Ein Array von Bildern in den Seitenansichtscontroller laden
    // Initialisieren mit den oben gespeicherten Daten
    NSArray *array = [[NSArray alloc] initWithArray:myImages];
    [self setImages:array];

    //Die Bilddaten freigeben
    [myURLS release];
    [myData release];
    [myImages release];
    [array release];
}

}

Dieser Code funktioniert, da auf dem Server immer eine bestimmte Anzahl von Bildern zum Herunterladen vorhanden ist, in diesem Fall 4.

Mein Problem ist jedoch, dass es bei einer Erhöhung der Anzahl von Bildern auf beispielsweise 20 zu einer sehr langen Wartezeit kommt, während die Bilder heruntergeladen und angezeigt werden.

Grundsätzlich möchte ich gerne zum Beispiel 5 Bilder mit dem Ladebildschirm herunterladen und dann die restlichen 15 herunterladen, während der Benutzer die ersten 5 Bilder anzeigen kann. Kann mir jemand Hinweise geben, wie ich das machen könnte?

Wenn die Bilder heruntergeladen werden, werden sie auf die Größe des iPhone-Bildschirms skaliert und in ein UIScrollView zur Ansicht platziert.

Danke,

Jack

2voto

rptwsthi Punkte 9975

Zum Hintergrundbild-Download:

-(void)imageDownloadStart
{
[self performSelectorInBackground:@selector(downloadImages) withObject:nil];
}

-(void)downloadImages
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

//IHREN DOWNLOAD-CODE HIER EINFÜGEN

if(yourCondition)
  {
  [self performSelectorOnMainThread:@selector(imageDownloadStart) withObject:nil waitUntilDone:YES];
  } 
[pool release];
}

Und zur Größenänderung:

-(UIImage *)resizeImage:(UIImage *)image withSize:(CGSize)newSize
{
float actualHeight = image.size.height;
float actualWidth = image.size.width;
float imgRatio = actualWidth/actualHeight;
float maxRatio = newSize.width/newSize.height;

if(imgRatio!=maxRatio)
{
    if(imgRatio < maxRatio){
        imgRatio = newSize.width / actualHeight;
        actualWidth = round(imgRatio * actualWidth);
        actualHeight = newSize.width;
    }
    else{
        imgRatio = newSize.height / actualWidth;
        actualHeight = round(imgRatio * actualHeight);
        actualWidth = newSize.height;
    }
}
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
UIGraphicsBeginImageContext(rect.size);
[image drawInRect:rect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//[resizedImage release];
return resizedImage;
}

1voto

Jano Punkte 61585

Allerdings ist mein Problem folgendes: Wenn ich die Anzahl der Bilder erhöhen würde, zum Beispiel auf 20, müsste man sehr lange warten, während die Bilder heruntergeladen und dann angezeigt werden.

NSURLConnection erlaubt nur 6 gleichzeitige Verbindungen zu jedem Server. Sie sollten eine NSOperationQueue verwenden und setMaxConcurrentOperationCount aufrufen, um einen Wert kleiner als 6 festzulegen.

Die Bibliothek ASIHTTPRequest implementiert diesen Ansatz mit maximal 4 gleichzeitigen Operationen (falls in Ihrem Code noch etwas anderes eine Anfrage macht). Sehen Sie ein Beispiel in diesem Modultest.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X