2016-10-10 12 views
0

In meiner App habe ich eine UITableView mit riesigen UITableViewCells. Jede der Zellen ist dynamisch und wird zur Laufzeit erstellt. Indem wir nicht nur den Inhalt, sondern auch die Layouts dynamisieren, sind sie dynamisch. Das Problem ist, es dauert zu lange und es stottert beim Scrollen. Insbesondere wenn eine neue Zelle den Bildschirm betritt, ist mindestens 1 Sekunde eingefroren.Wie fügt man Asynchron zu einer UITableViewCell in iOS hinzu?

Gibt es eine Möglichkeit, diese Leistung zu verbessern? Ich habe dieses Tutorial auf Zellen asynchron geladen:

https://blog.uship.com/shippingcode/populating-uitableviewcells-asynchronously-to-fix-uitableview-lag/

Doch dieses Tutorial zeigt, wie Daten in statische Zellen asynchron zu laden. Ich muss dynamische Daten in dynamische Layouts laden.

+0

In welcher Sprache möchten Sie Ihre Lösung? Objc c oder schnell? –

+0

Ich benutze swift. Aber jede Lösung wird an diesem Punkt tun. Ich habe keine Optionen. –

+0

Haben Sie Bild auf Zelle vom Server? oder nur Daten? –

Antwort

4

Hier sind einige wenige Spitzen ich, dass hoffentlich helfen Ihnen

1 >> Versuchen Sie, Ihre Zelle Tableview zu verwenden, indem sie die wiederverwendbare Kennung in Ihrer Zelle xib Bereitstellung (Wenn Zelle Brauch ist).

2 >> Suchen Sie nach der Schleife in der cellForTheRowAtIndexPath-Methode (führen Sie keine Schleife darin durch).

3 >> Wenn Sie einige Daten wie Bilder in der cellForTheRowAtIndexPath-Methode herunterladen, stellen Sie sicher, dass Sie sie asynchron herunterladen.

4 >> Führen Sie die UI Aufgabe Bild in Zelle auf dem Haupt-Thread wie

[NSOperationQueue mainQueue]addOperationWithBlock:{ 
}]; 

5 >> Ovoid über Anlage in cellForTheRowAtIndexPath Verfahren wie viele, wenn und sonst Aussagen wie Einstellung. enter image description here

+0

Ich kann die Zellen nicht wirklich wiederverwenden, da jeder von ihnen anders ist. –

+0

Legen Sie das Bild oder die Daten in Ihrem Etikett im Hauptthread in cellForRowAtIndexPathMethod fest. [NSOperationQueue mainQueue] addOperationWithBlock: { }]; – mukul

+0

Danke für die Tipps. Ich habe viele Bedingungen in der CellForRow-Methode. Will recyde sie ein bisschen. –

1

Versuchen Sie es innerhalb der CellForRowAtIndexPath-Methode. Ich habe eine benutzerdefinierte Ansicht für eine Zelle und eine Bildansicht für diese benutzerdefinierte Ansicht hinzugefügt. Sie können UILabel, UIButton oder irgendetwas hinzufügen.

- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    NSString * CellIndentifier = @"CellIndentifier"; 

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:nil]; 

    if(cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIndentifier]; 

     cell.backgroundColor = [UIColor clearColor]; 
     cell.selectionStyle = UITableViewCellSelectionStyleDefault; 
    } 


UIView *cellVW ; 
UIImageView *logoImg; 

cellVW = [[UIView alloc] initWithFrame:CGRectMake(10, 2, tableView.frame.size.width-20, 216)]; 
cellVW.backgroundColor = [UIColor clearColor]; 
cellVW.layer.cornerRadius = 5; 
cellVW.layer.borderWidth = 1; 
cellVW.layer.borderColor = [[UIColor lightGrayColor] CGColor]; 
[cell addSubview:cellVW]; 

logoImg = [[UIImageView alloc] init]; 
logoImg.frame = CGRectMake(10, 5, tableView.frame.size.width-20, 140); 
logoImg.backgroundColor = [UIColor clearColor]; 
logoImg.layer.borderColor = [[UIColor lightGrayColor] CGColor]; 




NSURL *imageURL = [NSURL URLWithString:@"https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg"]; 
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:imageURL] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
{ 

    if(error == nil) 
    { 
     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response; 

     if([httpResponse statusCode] == 200) 
     { 
      UIImage *image = [UIImage imageWithData:data]; 

      logoImg.image = image; 


     } 
     else 
     { 

     } 
    } 
}]; 



    [cellVW addSubview:logoImg]; 

    return cell; 


} 
+0

Dies setzt voraus, dass es eine UIImageView in der Zelle gibt, mit zu beginnen. Was ich brauche, ist auch das Erstellen der UIImageView async. –

+0

Sie haben zwei Schritte hier gezeigt. Das Element in einem Thread erstellen und ihren Wert lokal oder vom Server aus festlegen. Das sind die Regeln bisher. Ihr Hauptziel sollte es sein, das Einfrieren der Benutzeroberfläche zu vermeiden. Was sind deine Ziele? –

+0

Sehen Sie in Ihrem Referenzcode: Ich habe ihre Animation gesehen. Ich habe so oft gearbeitet. Beachten Sie diese Zeilen: dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() - > Void in lassen text = self.model.textForIndexPath (indexPath) dispatch_async (dispatch_get_main_queue() {() - > Void in cell.textLabel ?.text = text }) }) –

Verwandte Themen