UITable ruckelt beim darstellen von Bildern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UITable ruckelt beim darstellen von Bildern

    Guten Abend allerseits,

    ich bin noch relativ neu in Sachen iPhone Programmierung. Bin sonst eher mit PHP, JS, etc. unterwegs und tue mir hier und da leider noch etwas schwer. Ich bräuchte da Hilfe zu meine Problem mit einer Table und Bildern die ich darin anzeigen möchte. Und zwar handelt es sich konkret um eine NSTableView die ich mit Daten füttere. Die kommen per JSON an, werden aufbereitet und am Schluss habe ich ein MutableArray in dem meine Daten stehen. Unter anderem auch eine URL zu einem Bild.
    Lasse ich die Bilder weg funktioniert alles einwandfrei, nichts ruckelt, alles wunderbar. Sobald ich aber die Bilder mit in die Table reinnehme, ruckelt es gewaltig. Ich tippe auf ein Speicherproblem, bin mir da aber absolut nicht sicher.

    Es ist ein 5.0er Projekt mit ARC und Storyboard.

    Hier ist mein Codeschnipsel:


    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewsCell"];
    4. cell.textLabel.text = [[listItems objectAtIndex:indexPath.row] objectAtIndex:1];
    5. cell.detailTextLabel.text = [[listItems objectAtIndex:indexPath.row] objectAtIndex:2];
    6. // Set image
    7. NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[[listItems objectAtIndex:indexPath.row] objectAtIndex:3]]];
    8. UIImage *cellImage = [UIImage imageWithData:imageData];
    9. cell.imageView.image = cellImage;
    10. imageData = nil;
    11. cellImage = nil;
    12. return cell;
    13. }
    Alles anzeigen




    Ich weiß, dass man hier noch wesentlich mehr verbessern kann als nur die Sache mit dem Bild, aber ich taste mich langsam ran :)


    Vielen Dank im Voraus für Eure Hilfe und Anregungen!
  • Sorry wenn ich so blöd fragen muss, aber zwecks Caching:

    Liege ich hiermit richtig? -> Wie zeige ich ein Bild in NSView an ?

    Habt Ihr noch einen Tipp für mich bzgl. Caching in Verbindung mit initWithContentsOfURL? Oder ist es evtl. besser, sich die Daten erst als Stream für NSData zu holen und dann daraus ein Image zu erstellen was ich dann besser cachen kann?
    Was das angeht muss ich leider wirklich blöd nachfragen da ich noch recht weit am Anfang stehe... :wacko:
  • Ohne den Link gelesen zu haben: Du solltest nicht, während Du die UI aufbaust, synchron (initWithContentsOfURL: ) die Bilddaten nachladen. Was tust Du, wenn Du keine Internetverbindung hast (sofern die URL keine lokale file-URL ist)? Dann steht die UI. Viel besser wäre es, die Images z. B. in einem eigenen Thread oder zumindest asynchron herunter zu laden und z. B. in einem schlichten Array zu speichern. Darauf greifst Du in der cellFor...:-Methode zu. Du könntest die Bilddaten auch z.B. ins Documents- oder Library-Verzeichnis der App herunterladen, damit Du die URL-Operationen nicht mehr hast. Dann befüllst Du das Cache-Array mit den Bildern von der lokalen "Platte". Oder Du speicherst sie in CoreData.

    Es gibt viele Möglichkeiten, die Daten zu cachen. Die wichtigste Erkenntnis für Dich ist aber, dass Du auf keinen Fall potenziell zeitintensive Operationen ausführen solltest, wenn Du die UI baust.

    #edit: Natürlich könnte man auch "das UI" sagen ... oder die "GUI" oder "das GUI".
  • fwtag schrieb:

    Ohne den Link gelesen zu haben: Du solltest nicht, während Du die UI aufbaust, synchron (initWithContentsOfURL: ) die Bilddaten nachladen. Was tust Du, wenn Du keine Internetverbindung hast (sofern die URL keine lokale file-URL ist)? Dann steht die UI. Viel besser wäre es, die Images z. B. in einem eigenen Thread oder zumindest asynchron herunter zu laden und z. B. in einem schlichten Array zu speichern. Darauf greifst Du in der cellFor...:-Methode zu. Du könntest die Bilddaten auch z.B. ins Documents- oder Library-Verzeichnis der App herunterladen, damit Du die URL-Operationen nicht mehr hast. Dann befüllst Du das Cache-Array mit den Bildern von der lokalen "Platte". Oder Du speicherst sie in CoreData.

    Es gibt viele Möglichkeiten, die Daten zu cachen. Die wichtigste Erkenntnis für Dich ist aber, dass Du auf keinen Fall potenziell zeitintensive Operationen ausführen solltest, wenn Du die UI baust.

    #edit: Natürlich könnte man auch "das UI" sagen ... oder die "GUI" oder "das GUI".
    Vielen Dank fwtag!
    Das sind genau die Informationen die ich brauche, bzw. die Denkanstöße in die richtige Richtung. Ich kümmere mich zwar schon darum, dass die JSON Inhalte für die Tabelle asynchron geladen werden und im Fehlerfall eine Meldung ausgegeben wird, aber bei den Bildern habe ich das überhaupt nicht bedacht!
    Die wichtigste Erkenntnis für Dich ist aber, dass Du auf keinen Fall potenziell zeitintensive Operationen ausführen solltest, wenn Du die UI baust.
    Und auch vielen Dank für diesen Tipp - den werde ich beherzigen!