iPhone NSURLConnection: connectionDidFinishLoading - comment retourner une chaîne de caractères à l'appel de la méthode
J'ai passé en revue similaire stackoverflow questions/réponses à cela, mais je suis toujours perplexe.
Je suis un débutant et j'ai vraiment du mal avec cette. Avec l'iPhone, je peux télécharger XML à partir d'une URL, mais je ne peut pas stocker la chaîne de résultat dans un NSString variable et voir à partir de la fonction appelante.
J'ai les déclarations suivantes en mesure à la classe:
@interface comms : NSObject {
NSString *currURL, *receivedString;
NSMutableData *receivedData;
NSURLConnection *conn;
}
@property (copy, readwrite) NSString *currURL;
@property (copy, readonly) NSString *receivedString;
@property (nonatomic, assign) NSMutableData *receivedData;
@property (nonatomic, assign) NSURLConnection *conn;
-(void) getContentURL;
J'ai la méthode suivante dans les comms de la classe:
-(void) getContentURL
{
NSLog( @"Begin getContentURL." );
//Request data related.
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init]
autorelease];
[request setURL:[NSURL URLWithString: currURL]];
//Content-Type related.
[request setValue:@"application/x-www-form-urlencoded"
forHTTPHeaderField:@"Content-Type"];
//Create Connection.
conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (conn) {
//The connection was established.
receivedData = [[NSMutableData data] retain];
NSLog( @"Data will be received from URL: %@", request.URL );
}
else
{
//The download could not be made.
NSLog( @"Data could not be received from: %@", request.URL );
}
//PROBLEM - receivedString is NULL here.
NSLog( @"From getContentURL: %@", receivedString );
}
J'ai créé les délégués dans les comms de la classe comme suit:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:
(NSURLResponse *)response
{
//Discard all previously received data.
[receivedData setLength:0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:
(NSData *)data
{
//Append the new data to the receivedData.
[receivedData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//Connection succeeded in downloading the request.
NSLog( @"Succeeded! Received %d bytes of data", [receivedData length] );
//Convert received data into string.
receivedString = [[NSString alloc] initWithData:receivedData
encoding:NSASCIIStringEncoding];
NSLog( @"From connectionDidFinishLoading: %@", receivedString );
//release the connection, and the data object
[conn release];
[receivedData release];
}
Je peux générer avec succès la receivedString chaîne à l'aide de NSLog dans le connectionDidFinishLoading délégué.
//Convert received data into string.
receivedString = [[NSString alloc] initWithData:receivedData
encoding:NSASCIIStringEncoding];
NSLog( @"From connectionDidFinishLoading: %@", receivedString );
Cependant, quand je suis sortie de la receivedString chaîne dans le getContentURL c'est nul (et donc aussi la valeur null à partir de la ViewController.m classe que j'appelle les comms classe).
//PROBLEM - receivedString is NULL here.
NSLog( @"From getContentURL: %@", receivedString );
Des idées sur comment je peux voir la valeur de receivedString dans getContentURL et de la ViewController.classe m?
OriginalL'auteur | 2010-02-12
Vous devez vous connecter pour publier un commentaire.
NSURLConnection est une API asynchrone. Lorsque vous démarrez la demande, l'objet se frayer un nouveau fil de discussion, et ne mettre à jour votre principal via la fonction de rappel/délégué méthodes. Votre méthode actuelle sera de retour très probablement avant la demande n'est pas terminée, et la chaîne du résultat n'auront pas encore été téléchargé!
Si vous voulez le faire de façon synchrone, vous avez deux options:
Fondamentalement, ce qu'il va faire, est de permettre que les rappels à être appelé sans d'abord la sortie de cette fonction/message.
OriginalL'auteur Grant Paul
Pour renvoyer des données de la part des délégués de la méthode, veuillez utiliser le Bloc de Code.
Voir Apple Bloque la documentation.
OriginalL'auteur Hassan Adeel