So erhöhen Sie die Geschwindigkeit des scrollen in der Tabelle anzuzeigen, wenn Bilder geladen werden, die in jeder Zelle?
Check-out die letzten Zeilen, bevor Sie [return cell]..Nachdem die Bilder geladen werden, die die Scroll-Geschwindigkeit abnimmt..es scheint den Blättern stecken bleibt
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
}
int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
NSString *itemDescription=[[stories objectAtIndex: storyIndex]
objectForKey:@"title"];
CGRect aframe = CGRectMake(80, 30, 250, 40);
textLabel = [[UILabel alloc] initWithFrame:aframe];
textLabel.font = [UIFont boldSystemFontOfSize:14];
textLabel.numberOfLines=0;
textLabel.textColor = [UIColor darkTextColor];
textLabel.backgroundColor = [UIColor whiteColor];
[cell.contentView addSubview:textLabel];
textLabel.text=itemDescription;
CGRect frame = CGRectMake(0, 0, 70,80);
UIImageView *TopImageView = [[UIImageView alloc] init];
[cell.contentView addSubview:TopImageView];
TopImageView.frame=frame;
m_strImage = [m_imglinkArray objectAtIndex:storyIndex];
TopImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:m_strImage]]];
TopImageView.image=TopImage;
return cell;
}
Könnte Ihr Jungs mir helfen, erhöhen die Geschwindigkeit des scrollen?
Hinsichtlich
Arun
- Sie sollten verbessern Sie die Formatierung von Euch Frage weil Ihr nicht lesbar...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass Sie eventuell zwei Probleme hier. Zunächst ist die Frage der nicht multi-threading wird das Bild geladen und die zweite ist, wie du mit UITableViewCell.
iPhone Anrufe cellForRowAtIndexPath immer, wenn eine Zelle auf dem Bildschirm angezeigt wird - wenn Sie nach unten scrollen, alles, was oben ist, entladen und erneut geladen, wenn Sie scrollen Sie wieder nach oben. Wie bereits angemerkt, das Problem kann mit multithreading-Muster - entweder den link gepostet markj.net und/oder durch die Verwendung NSThread. Der Vorteil NSThread ist, haben Sie mehr Flexibilität, um Probleme zu behandeln oder zu laden, mehr als nur Bild-Daten. (Ich benutze beide)
Um dies zu tun, effizient, die Sie brauchen, um eine custom UITableViewCell. Das ist gut, egal, da man die Zelle verantwortlich für den Inhalt, anstatt Ihre view-controller, und Sie können effizient zu manipulieren, Formatierung der Zellen und Inhalte. Hier ist ein link zu einem große post über UITableCellView: http://blog.atrexis.com/index.cfm/2009/1/6/iPhone--Customize-the-UITableCellView
Beim implementieren von UITableViewCell, tun Sie Ihr bestes, um alle addSubView und Formatierung Anrufe in die "if(cell==nil)" - block, nur wenn Sie nicht setzen Sie Sie in Ihre benutzerdefinierte initWithFrame. Sie finden das iPhone ist stacking jeden Untersicht, die Sie hinzufügen-es ist nicht-clearing-die alte Ansicht. Man kann das sehen bei der Arbeit durch das einstellen der Hintergrundfarbe zu "UIColor clearColor" und ändern Sie dann den text zwischen trifft-Sie sehen einen Stapel von text auf der jeweils anderen. Dies ist normalerweise nicht sichtbar, da die solid-gefüllten hintergrund zeichnen Sie sich über alle "alten" Untersichten.
Bevor Sie kombinieren diese beiden Methoden, erwägen die Einführung einer "Modell". Du hast ein view und ein controller, aber alle Daten sollten in einem Modell. Alle Bild-URLs, content, etc. sollte dann in etwas wie ein NSMutableArray, ein benutzerdefiniertes Objekt Ihrer eigenen oder vielleicht über SQLite. Sobald Sie ein Modell haben, können Sie die Implementierung Ihrer caching der Bilder. Mit caching, alle Bilder beibehalten werden zwischen Belastungen der Anwendung, das spart Batterien, Bandbreite und Zeit.
Ich würde:
1. legen Sie alle Ihre Daten in einem Modell von einer Art (NSMutableArray, SQLLite, etwas)
2. Implementieren Sie Ihre eigenen custom UITableViewCell
3. Stellen Sie sicher, Sie haben 0 addSubView, init, alloc oder Anrufe, die in der active block cellForRowAtIndexPath
4. Delegierung verwenden, Beispiel oder NSThread das laden aller Bilder in den hintergrund
5. Add local-image-caching
Gibt es einige gute Beispiele in über und auf den Apple-Foren zum Zwischenspeichern von Bildern.
nessence hat eine Menge guter Informationen. Ein paar weitere Gedanken:
Sind Sie leckt wie verrückt hier. Jede Zelle, die Sie erstellen, können Sie Leck 2 UILabels, ein UIImageView und ein UIImage.
Wie schon erwähnt, sind Sie nicht nur undicht, Sie sind sich in Ihrem Blick, denn Sie kleben auf der Oberseite des anderen mit addSubview:.
Erreichen, die das Netzwerk während eine Zelle ziehen, wird unglaublich langsam und Sperrung Ihrer UI. Wenn diese URLs sind lokale, dann können Sie UIImage s +imageWithContentsOfFile, wenn nicht, müssen Sie laden Sie diese in den hintergrund.
Ich glaube nicht, Sie brauchen einen thread hier. NSURLConnection ist ein ausgezeichneter Weg, um das laden der Daten im hintergrund, ohne den Verarbeitungsaufwand von threading.
nessence ist völlig richtig, dass Sie eine model-Klasse für die Geschichte.
Ihrem grundlegenden Ansatz zu den Mehrweg-cell-Konfiguration ist falsch. Sie nicht Holen Sie einen wieder verwendbaren Zelle und fügen Sie Untersichten, um es. Alle Ihre Untersichten sollte Hinzugefügt werden, in der wenn () - block zu erstellen, die die Zelle. Dann, in der jeder pass, ändern Sie einfach die Werte der Dinge. Ich habe neu geschrieben, einige Ihrer code unten, um zu demonstrieren. Dies ist noch nicht der richtige code, denn es ist zu erreichen, um das Netzwerk während eine Zelle zeichnen, und dieses möglicherweise zu viele Elemente werden in einer Untersicht-Zelle (anstatt eine benutzerdefinierte Zelle), aber es ist näher an der richtigen Idee. Ich weiß gar nicht, ob diese kompiliert; ich schrieb es hier.
Ich empfehlen Ihnen, verbringen einige Qualität Zeit mit dem Studium TableViewSuite, Praktische Memory-Management, und Coding-Guidelines für Kakao. Einige Zeit mit dem Studium der Grundlagen der Kakao wäre auch sehr nützlich, weil die coding-Stil hier zeigt Sie, dass Sie möglicherweise nicht haben eine solide Grundlage. Wenn es ein Mac book, habe ich noch empfehlen Cocoa-Programmierung für Mac OS X. Wenn Sie daran interessiert mit diesem zu lernen, iPhone, ich habe eine Auszug, die helfen könnten. Ich habe nicht überprüft, es noch nicht, aber Stanford online CS193P natürlich sieht vielversprechend aus.
dies wurde schon mehrfach gefragt, hier, was Sie tun müssen, ist, laden Sie asynchron Bilder für jede Zelle, um zu verhindern, dass der Bildlauf verlangsamen.
Dieser nennt sich "Lazy image loading" und ich bin das verweisen auf die apple-tutorial hier :
Lazy load-Bilder in UITableView
Es scheint, dass Sie das laden von einer url-jedes mal, wenn Sie die Tabelle anzeigen fragt man die Zelle für eine Zeile. Dies geschieht in der Hauptanwendungs-thread (User interface thread) und es blockiert die Benutzeroberfläche, so dass es nicht mehr reagiert.
Besonders wenn diese url ist eine Ressource, die Sie laden aus dem internet dann diese pause ist groß.
Ich würde empfehlen, dass Sie sollten laden Sie die Bilder in einen hintergrund-thread und display ein Bild als Platzhalter, bis Sie abgerufen werden aus dem Netzwerk.
Können Sie versuchen, die Lösung in der folgenden url...
http://www.markj.net/iphone-asynchronous-table-image/