2010-08-25 2 views
1

Je veux implémenter un classX qui fait des appels asynchrones mais aux yeux de l'appelant ClassC, classX devrait sembler séquentiel.Comment faire un algorithme piloté par événement dans Objective-C, similaire à NSXMLParser

ClassC instancie ClassX qui effectue certains appels HTTP via NSURLConnection et, par conséquent, il devient asynchrone (et je veux qu'il reste asynchrone).

La logique passe comme ceci:

ClassC:

- (void)callerWork 
{ 
    // shouldn't return until connection response completes 
    // and receives all of the response data 
    BOOL result = [classX doSomeWork]; 
} 

ClassX:

- (void)doSomeWork 
{ 
    // With an NSURLRequest, initiates a NSURLConnection 

    // Only after all of the data is received (or error) from 
    // NSURLConnection via NSURLConnectionDelegate methods, 
    // return from this method 
} 

// Implements relevant NSURLConnectionDelegate methods 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ } 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ } 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ } 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ } 
@end 

Fondamentalement, je veux imiter la façon dont NSXMLParser fonctionne que vous invoquez sa méthode "analyser" qui ne revient pas tant que tout le travail n'est pas terminé. Pour traiter les données, NSXMLParser appellera les méthodes NSXMLParserDelegate pertinentes, mises en œuvre par la classe d'appel, comme ceci:

- (void)parseWork 
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dataToParse]; 
    [parser setDelegate:self]; 

    // 'parse' method doesn't return right away - execution continues 
    // only after all of the data has been parsed, which means the delegate 
    // methods are getting called in the interim. 
    BOOL parseResult = [parser parse]; 
} 

Ce qui est une bonne façon de le faire?

Je sais que vous devez avoir une classe servant de délégué de l'autre pour les rappels mais avec quel mécanisme faites-vous que '[parser parse]' ne retourne pas tout de suite?

Répondre

0

Votre méthode classX peut démarrer un autre thread pour effectuer tout le travail asynchrone et se mettre en veille jusqu'à ce que le thread de travail le réveille à la fin. N'appelez pas cette méthode à partir du thread principal, car vous ne voulez pas dormir dans le thread principal de l'interface utilisateur.

+0

Qu'en est-il de l'utilisation de NSRunLoop? –

+0

Une nouvelle boucle d'exécution doit toujours se trouver dans un autre thread que l'appel de la méthode classX. – hotpaw2

Questions connexes