2010-11-19 7 views
1

Ich möchte eine UIProgressView anzeigen, die die Menge der empfangenen Daten angibt, während ich JSON-Daten mit Hilfe von touchJSON anfordere. Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Größe der empfangenen Daten anzuhören.iOS: TouchJSON & abgerufene Datengröße

Ich ersuche Daten mit dem folgenden:

- (NSDictionary *)requestData 
{ 
    NSData   *data  = [NSData dataWithContentsOfURL:[NSURL URLWithString:apiURL]]; 
    NSError   *error  = nil; 
    NSDictionary *result  = [[CJSONDeserializer deserializer] deserializeAsDictionary:data error:&error]; 

    if(error != NULL) 
     NSLog(@"Error: %@", error); 

    return result; 
} 

Antwort

1

Sie werden etwas mehr Code einführen müssen, um ein Download-Statusanzeige, Bar. Im Moment laden Sie die Daten mit [NSData dataWithConentsOfURL:...] herunter. Stattdessen erstellen Sie eine Klasse, die ein Objekt NSURLConnection verwendet, um Daten herunterzuladen, diese Daten in einem MSMutableData-Objekt zu sammeln und Ihre Benutzeroberfläche entsprechend zu aktualisieren. Sie sollten den HTTP-Header ContentLength und die Aktualisierungen - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; verwenden können, um den Status des Downloads zu ermitteln.

Hier sind einige relevanten Methoden:

- (void) startDownload 
{ 
    downloadedData = [[NSMutableData alloc] init]; 
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
} 

- (void)connection:(NSURLConnection *)c didReceiveResponse:(NSURLResponse *)response 
{ 
    totalBytes = [response expectedContentLength]; 
} 

// assume you have an NSMutableData instance variable named downloadedData 
- (void)connection:(NSURLConnection *)c didReceiveData:(NSData *)data 
{ 
    [downloadedData appendData: data]; 
    float proportionSoFar = (float)[downloadedData length]/(float)totalBytes; 
    // update UI with proportionSoFar 
} 

- (void)connection:(NSURLConnection *)c didFailWithError:(NSError *)error 
{ 
    [connection release]; 
    connection = nil; 
    // handle failure 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)c 
{ 
    [connection release]; 
    connection = nil; 
    // handle data upon success 
} 

Ich persönlich denke, dass der einfachste Weg, dies zu tun ist, um eine Klasse zu erstellen, die die oben genannten Methoden implementiert generische Daten-Downloads und Schnittstelle mit dieser Klasse zu tun.

Dies sollte genug sein, um Sie zu bekommen, was Sie brauchen.