Frage

Ich brauche mehrere asynchronen Service-Anrufe in der Anwendung zu machen: didFinishLaunchingWithOptions: Methode aus meiner Anwendung delegieren, um einige Daten aus einem Dienst abgerufen wird über verschiedene Controller in meiner Anwendung verwendet werden. Ich habe die Kontrolle über den Dienst, und ich habe die API sein als RESTful wie möglich zu gestalten, so dass ich mehrere Anrufe bei der App-Initialisierung vornehmen muß.

Was ich tun möchte, ist eine Lade Ansicht mit einer Fortschrittsanzeige zeigen - ähnlich den Standard-Splash-Screen von Default.png - und diese Ansicht entfernen, sobald die Serviceanrufe abgeschlossen haben, und ich habe die Anfangswerte die ich brauche. Dies ist sehr einfach zu tun, wenn es nur ein Service-Anruf ist, da ich einfach diese Logik in die connectionDidFinishLoading Haken kann. Delegatmethode von NSURLConnection durch die Lade Ansicht versteckt und die Root-Controller Anzeige

Allerdings mit mehreren Service-Anrufe, wird es schwierig. Ich kann „Kette“ alles zusammen und Feuer aus einer Anfrage, warten, bis es beendet / nicht bestanden, dann die zweite Anfrage abfeuern, und so weiter, bis ich in die letzten Anfrage zu bekommen. In der letzten Anfrage, verstecke ich dann die Lade Ansicht und zeigt die Normalansicht. Dies kann jedoch mit mehreren Service-Anrufen unhandlich bekommen, und der Code wird schwer zu verstehen und zu befolgen.

Irgendwelche Vorschläge auf dem besten Ansatz für das?

Ich bin eine Lösung zu denken ist eine Singleton-Klasse für die Herstellung von Service-Anrufen und App-Initialisierung verantwortlich zu haben. Das Singleton-Objekt wird alle notwendigen Anforderungen parallel zu Beginn abfeuern, und jeder Fail / Ziel-Rückruf wird prüfen, ob jede Anfrage beendet hat. Wenn alle Anforderungen abgeschlossen haben, dann kann es eine Methode in der Anwendung delegieren anrufen und sagen, dass es das Laden zu verbergen, zeigen die Root-Controller, etc.

Die Gedanken?

War es hilfreich?

Lösung

Eine weitere Möglichkeit ist es, jedes Dienstvollendungs ??hat Rückruf (NSNotification) die Steuereinrichtung der Fortschrittsanzeige benachrichtigen, dass Fortschritte erzielt wurden. Sie könnten auch die Steuerung des Fortschrittsanzeige von sagen, wie viele Anfrage Sie machen wollten, und lassen Sie es Partitur zu halten, und selbst tun einen Rückruf, wenn es denkt, dass alles getan wird.

Andere Tipps

Ich tue etwas ähnliches mit einem NSOperationQueue, die zu einem Zeitpunkt nur ausführen 1-Betrieb konfiguriert ist. Siehe zum Beispiel WeaveEngine.m und es ist synchronizewithServer:credentials: Methode. Ich Warteschlange alle die einzelnen Operationen auf, die meist Asynchron-Netzwerk Anrufe sind.

könnten Sie NSThreading verwenden und synchrone Aufrufe in separaten Threads für jede Sache, die Sie wie bekommen müssen machen

[NSThread detachNewThreadSelector:@selector(getDataRequest1:) toTarget:self withObject:urlRequest];
[NSThread detachNewThreadSelector:@selector(getDataRequest2:) toTarget:self withObject:urlRequest];
[NSThread detachNewThreadSelector:@selector(getDataRequest3:) toTarget:self withObject:urlRequest];

dann im Selektor für jeden Thread tun so etwas wie

- (void) getDataRequest1:(NSURLRequest*)urlRequest {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSHTTPURLResponse *urlResponse;
    NSError *error;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&error];
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    if ([urlResponse statusCode] < 200 || [urlResponse statusCode] > 299) {
        //request probably failed
    }else{
        [self performSelectorOnMainThread:@selector(completeRequest1:) withObject:responseData waitUntilDone:NO];           
    }
    [pool drain];
    [responseString release];
    [urlRequest release];   
}

natürlich hängt es davon ab, wie viele Anfragen / Threads Sie laichen fehlen. und Sie müssen, um zu verfolgen, wie viele Sie laichen vs wie viele Finish, so dass Sie richtig Ihre Spinner stoppen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top