2016-06-19 13 views
0

Die Anforderung besteht darin, die edmunds-API aufzurufen und den Namen des Verkäufers in einer Tabelle anzuzeigen, sobald die App gestartet wird.Wie wird die API-Methode ausgeführt, bevor Tabellenansicht geladen wird?

1) -getAPIData()

Ruft die Namen von Händlern und speichert in self.dealerName Array.

-(void)getAPIData{ 
    NSURLSession *session = [NSURLSession sharedSession]; 
    self.task = [session dataTaskWithURL:[NSURL URLWithString:[NSString stringWithFormat: 
               @"https://api.edmunds.com/api/dealer/v2/dealers?zipcode=%@&radius=%@&fmt=json&api_key=ycwedw68qast829zx7sn9jnq", 
               @"01609",@"10"]] 
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     if (data.length > 0 && error == nil) 
     { 
      NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:data 
                    options:kNilOptions 
                    error:NULL]; 
      self.dealersDictionary = jsonData[@"dealers"]; 
      for (id item in self.dealersDictionary){ 
       if (item[@"name"] != nil){ 
        self.dealerName = item[@"name"]; 
        NSLog(@"%@",self.dealerName); 
       }else{ 
        NSLog(@"could'nt find the names"); 
       } 
      } 
     } 
    } 
]; 
} 

2) -viewDidLoad()

Diese Methode ruft getAPIData (obiges Verfahren).

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self getAPIData]; 
} 

3) - (NSInteger) tableview: (UITableView *) Tableview numberOfRowsInSection: (NSInteger) Abschnitt

Gibt die Händler zählen.

-(NSInteger)tableView:(UITableView *)tableview numberOfRowsInSection:(NSInteger)section 
{ 
    [self.task resume]; 
    return self.dealerName.count; 
} 

Die getAPIData() -Methode wird ausgeführt, nachdem numberOfRowsInSection() aufgerufen wurde. Also wird die Tabelle leer gemacht.

Wie kann ich die getAPIData() aufrufen, bevor die Tabelle auf dem Bildschirm geladen wird?

Antwort

0

Ich glaube, das Problem hier ist, dass NSURLSession dataTaskWithURL asynchron ist.

I Denken Sie Sie könnten weiterhin eine asynchrone Methode verwenden und [self.tableView reloadData]; aufrufen, nachdem der Aufruf erfolgreich zurückgegeben wird (z. B. in Ihrem Beendigungshandler). Sie können einen Aktivitätsindikator anzeigen, während Sie auf den Ladevorgang warten.

Oder Sie könnten eine blockierende, synchrone Anforderung wie so machen:

// define the URL 
NSURL url = [NSURL URLWithString: @"https://api.edmunds.com/api/dealer/v2/dealers?zipcode=%@&radius=%@&fmt=json&api_key=ycwedw68qast829zx7sn9jnq"]; 

// attempt the request 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
                timeoutInterval:10]; 
[request setHTTPMethod: @"GET"]; 

NSError *reqError; 
NSURLResponse *urlResponse; 
NSData *returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&reqError]; 

// parse `returnedData` here 

Jetzt werden Sie Ihre NSData Objekt haben, und Sie können es hier die gleiche Art und Weise analysieren Sie in Ihrem completionHandler taten. Diese Option ist sinnvoll, wenn Sie darauf vertrauen, dass Ihre Anfrage schnell zurückkehrt.

Endgültige Option: Verwenden Sie NSURLConnection, um eine asynchrone Anforderung auszuführen, und verwenden Sie die Delegatenmethode - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data, um eine UIProgressView für genauere Indikator der Aktivität zu aktualisieren. Ich möchte Sie ermutigen, sich diese Methode anzusehen, wenn die Antwortzeit Ihrer Anfrage lang genug ist, um den Benutzer zu fragen, ob etwas passiert (z. B. mehr als ein paar Sekunden).

+0

Vielen Dank Ihre Antwort hat mir geholfen. – Sandy

8

Kurze Antwort: Sie nicht. Sie zeigen eine leere Tabellenansicht an, und dann rufen Sie im Abschlussblock die reloadData-Methode der TabelleView auf und DANN lädt sie den Inhalt.

+2

Sie können die Antwort auch in einem Cache speichern, damit beim nächsten Start der App sofort Daten angezeigt werden, während Sie auf die neuen Daten warten. Dies wäre ziemlich einfach zu tun, da Sie die Postleitzahl sowieso fest programmiert haben. –

+0

@DanielT., Das stimmt, und wahrscheinlich eine gute Idee. –

Verwandte Themen