2016-12-04 7 views
1

In meiner Anwendung implementiere ich UITableView mit Daten holen von URL.Update UiTableview mit Daten von der URL

Alles geht gut.Aber das Problem hier ist die Daten aus Back-End-URL ist zu groß. So zeige ich UIActivityIndicatorView bis das Datenholen abgeschlossen ist.

Aufgrund der großen Daten dauert es meistens 3 oder 4 Minuten zum Abrufen. So, wie man UITableView mit Daten aktualisiert, die von der URL so bald wie möglich erhalten.

Ich verwende asynchronousRequest, um es zu tun.

habe ich diesen Code in cellForRowAtIndexPath

NSString *post = [NSString stringWithFormat:@"skey=%@&user_id=%@",@"sa6rw9er7twefc9a7dvcxcheckedin",@"3225"]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://chkdin.com/dev/api/peoplearoundmexy/?%@",post]]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:nil]; 

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    if (data) { 
     id json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
     NSMutableArray *designation=[json valueForKey:@"designation"]; 
     UIImage *imageobj1=[UIImage imageNamed:@"userpic.jpg"]; 
     NSData *imagedata = UIImagePNGRepresentation(imageobj1); 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       PeopleNearbyCell *updateCell = (id)[collectionview cellForItemAtIndexPath:indexPath]; 
       if (updateCell) 

        cell.UserProfilePic.image = [UIImage imageWithData:imagedata]; 
      }); 
    } 
}]; 
[task resume]; 

Aber es funktioniert nicht. Wie kann ich das erreichen?

+0

Ich würde die Anfrage innerhalb 'cellForRowAtIndexPath' nicht ausführen, sondern innerhalb der' viewDidLoad'. Ich glaube, 'cellForRowAtIndexPath' wird immer dann aufgerufen, wenn eine neue Zelle benötigt wird, ob beim ersten Füllen des Bildschirms mit Zellen oder wenn eine neue Zelle in den Bildschirm gescrollt wird. – damiancesar

+0

Selbst wenn ich den Server in Sicht traf, lud auch, zu viel Zeit zu nehmen, um Daten zu erhalten. Ich möchte nicht warten, bis Daten vollständig geladen sind, was ich Daten von der URL kontinuierlich bekomme Ich muss Tabellenansicht aktualisieren –

+0

Haben Sie versucht, die Menge der Daten zu verringern, die Sie anfordern möchten? Ich weiß, dass einige Endpunkte eine Option dafür haben. – damiancesar

Antwort

0

Die Netzwerkanforderung ist asynchrone Verarbeitung, cellforrowatindexpath ist im Hauptthread, wenn Sie die Tabelle in der Netzwerkanforderung aktualisieren müssen, müssen Sie eine Netzwerkanforderungsmethode schreiben, und dann erhalten Sie die Daten, in denen die Methode Zuweisung, dann aktualisieren Sie die Tabelle.

0

Sie können lazyload Methode verwenden. Dieser Code im CellForRow-Delegaten.

[cell.loadActivity startAnimating]; 

    dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
     dispatch_async(backgroundQueue, ^{ 

      // YOUR LOAD FROM URL METHOD HERE. 

      // only update UI on the main thread 
      dispatch_async(dispatch_get_main_queue(), ^{ 


       if (img==nil) { 

        // HANDLE WHEN IMAGE RETRIEVE FAILED 
       } else { 

        // ASSIGN IT 
        cell.UserProfilePic.image = img; 
       } 

       [cell.loadActivity stopAnimating]; 

      }); 

     }); 
Verwandte Themen