2009-03-10 6 views
2

Je veux créer une classe pour gérer tout le travail de connexion HTTP pour les autres classes (afin d'éviter d'écrire des codes à plusieurs reprises). Je l'appelle ConnectionCenter (sous-classe de NSObject) et ajouter les codes suivants à ce:Comment configurer une connexion HTTP dans une classe spéciale?

-(void)connect:(NSString *)strURL obj:(ConnectCenter *)objConnect 
{ 
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL] 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:objConnect]; 
    if (theConnection) 
    { 
     // receivedData is declared as a method instance elsewhere 
     receivedData = [[NSMutableData data] retain]; 
    } 
    else 
    { 
     // inform the user that the download could not be made 
    } 

} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // append the new data to the receivedData 
    // receivedData is declared as a method instance elsewhere 
    [receivedData appendData:data]; 
} 

et d'autres classes appelle en passant une URL et un objet de ConnectionCenter. Mais la méthode 'didReceiveData' dans ConnectionCenter n'est pas appelée. Des idées sur quel est le problème avec ça?

+1

Pourquoi cette méthode connect: accepte-t-elle un ConnectionCenter dans son second argument? N'est-ce pas une méthode de ConnectionCenter? Si oui, pourquoi passez-vous l'objet à lui-même, alors qu'il pourrait simplement se référer à lui-même de façon normale ('self')? –

+0

Je fais ce changement parce que la façon normale «moi» ne fonctionne pas. Si cela ne fonctionne toujours pas, je vais revenir en arrière. –

+0

Merci. Je change le délégué en 'soi' et cela fonctionne. –

Répondre

2

Vous devrez appeler [theConnection setDelegate:self] après avoir configuré la connexion, car connection:didReceiveData: est une méthode déléguée.

Lire le documentation pour plus d'informations.

0

Quelques choses à propos de ce code ...

D'abord, il est confus quel objet vous définissez en fait en tant que délégué. L'appel à la connexion: didReceiveData: va être appelé sur le délégué de la connexion, quel que soit l'objet que vous avez passé dans votre méthode connect: obj:. Il semble étrange que vous ayez une méthode d'instance sur ConnectionCenter qui peut démarrer une connexion avec un objet ConnectionCenter différent en tant que délégué. Assurez-vous que vous regardez la connexion: didReceiveData: méthode sur le bon objet.

Si vous ne recevez aucune donnée, il est possible que votre connexion ne soit pas parvenue à se connecter ou soit simplement terminée sans renvoyer de données. Vous devez implémenter connectionDidFinishLoading: et connection: didFailWithError: déléguez les méthodes afin de savoir si la connexion est terminée, avec ou sans retour de données. Enfin, vous avez une condition de course qui vous mordra si vous obtenez une bonne connexion rapide. L'objet NSURLConnection commencera à s'exécuter dès que vous le créerez. S'il y a des données à lire, appelez connection: didReceiveData: et vous l'ajouterez à receivedData. Mais si la connexion est assez rapide, vous pourriez finir par essayer d'ajouter des données à une donnée reçue qui n'a pas encore été créée. C'est une petite chance, mais même si la méthode init de NSURLConnection ne bloque pas, il est imprudent de faire des suppositions sur la quantité de travail qu'il fait pour obtenir la connexion avant de revenir. Créez receiveData avant de démarrer la connexion afin de vous assurer d'avoir un emplacement où placer les données.

+0

Merci en effet. Je change le délégué en 'soi' et cela fonctionne. Peut-être qu'il y avait une erreur de connexion la dernière fois. –

Questions connexes