2010-12-02 29 views
0

Je continue d'obtenir une erreur très étrange lors de l'utilisation de la requête asi-http lorsque j'utilise des sélecteurs pour enregistrer les rappels de succès et d'échec.erreur de sélection asynchrone asi-http-request

Les méthodes suivantes sont utilisées:

// Sets up a request and takes care of the stuff that needs to be for each 
// and every request. 
- (void) setup:(NSString *) fragment successCallback:(SEL) success_callback failureCallback:(SEL) failure_callback { 

    // Convert the string to a url 
    NSString *url = [[NSString alloc] initWithFormat:@"%@%@", 
    self.server.serverUrl, 
    fragment 
    ]; 
    NSURL *full_url = [NSURL URLWithString: url]; 

    // Time to setup the request 
    self.curRequest = [ASIFormDataRequest requestWithURL:full_url]; 
[self.curRequest setDelegate:self]; 
[self.curRequest setDidFailSelector:success_callback]; 
[self.curRequest setDidFinishSelector:failure_callback]; 

// If we're using iphone os version 4.0 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 
[self.curRequest setShouldContinueWhenAppEntersBackground:YES]; 
#endif 

// Clean up time! 
[url release]; 
[full_url release]; 

}

La méthode de registre

- (void) register_user:(NSString *) email password:(NSString *) password confirmPassword:(NSString *) confirm_password successCallback:(SEL) success_callback failureCallback:(SEL) failure_callback { 

[configuration auto: @ "/ users/register" successCallback: success_callback failureCallback: failure_callback ]; // Configurer l'entrée de la méthode [self.curRequest setPostValue: email forKey: @ "email"]; [self.curRequest setPostValue: mot de passe forKey: @ "mot de passe"]; [self.curRequest setPostValue: confirm_mot_de_passe forKey: @ "confirm_password"];

NSLog (@ "Nous sommes arrivés ici:) ~% @% @% @", email, mot de passe, confirm_password);

[self.curRequest startAsynchronous]; }

Succès et échec Callbacks

- (void) registerSuccess: (ASIHTTPRequest *) request { 
    NSString *response = [request responseString]; 
    NSLog(@"Response string: %s", response); 
} 

// Called when the http request fails. That means it could not 
// reach the server for an unknown reason. 
- (void) registerFailure: (ASIHTTPRequest *) request { 
    NSError *error = [request error]; 
    NSLog(@"Register error: %s", [error localizedFailureReason]); 
} 

J'invoque la méthode de registre comme ceci:

[self.appdelegate.userModel register_user: self.emailAddress.text mot de passe: self.password.text confirmPassword: self.confirmPassword.text successCallback: @sélecteur (registerSuccess :) failureCallback: @selector (registerFailure :) ];

Le callstack et l'erreur de gdb:

2010-12-02 12:33:56.889 ProjectPrototype[2201:6003] -[__NSCFType absoluteURL]: unrecognized selector sent to instance 0x6457c60 
2010-12-02 12:33:56.891 ProjectPrototype[2201:6003] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType absoluteURL]: unrecognized selector sent to instance 0x6457c60' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x0292eb99 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x02a7e40e objc_exception_throw + 47 
    2 CoreFoundation      0x029306ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x028a02b6 ___forwarding___ + 966 
    4 CoreFoundation      0x0289fe72 _CF_forwarding_prep_0 + 50 
    5 CoreFoundation      0x02843b04 CFURLCopyAbsoluteURL + 100 
    6 CFNetwork       0x023fe5e8 _ZN11HTTPMessage10initializeEPK10__CFStringPK7__CFURLS2_ + 52 
    7 CFNetwork       0x023fe50c CFHTTPMessageCreateRequest + 80 
    8 ProjectPrototype     0x00011360 -[ASIHTTPRequest main] + 852 
    9 Foundation       0x000c83ca __NSThreadPerformPerform + 251 
    10 CoreFoundation      0x0290ffaf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
    11 CoreFoundation      0x0286e39b __CFRunLoopDoSources0 + 571 
    12 CoreFoundation      0x0286d896 __CFRunLoopRun + 470 
    13 CoreFoundation      0x0286d350 CFRunLoopRunSpecific + 208 
    14 CoreFoundation      0x02870614 CFRunLoopRun + 84 
    15 ProjectPrototype     0x00023b55 +[ASIHTTPRequest runRequests] + 173 
    16 Foundation       0x000b376c -[NSThread main] + 81 
    17 Foundation       0x000b36f8 __NSThread__main__ + 1387 
    18 libSystem.B.dylib     0x9689881d _pthread_start + 345 
    19 libSystem.B.dylib     0x968986a2 thread_start + 34 
) 
terminate called after throwing an instance of 'NSException' 

Je vous remercie de toute aide, merci beaucoup:) ~

Répondre

4

Dudester vous avez deux priblems graves de syntaxe:

En premier lieu, chaque utilisation de ceci est incorrect:

self.curRequest 

Le première fois seulement vous définissez la demande, utilisez self.request = blah.

Après que, il suffit d'utiliser [curRequest xyz]

Deuxième problème grave,

[self.curRequest setDidFailSelector:success_callback]; 
[self.curRequest setDidFinishSelector:failure_callback]; 

Vous avez oublié le bit 'sélecteur', il devrait ressembler à ceci:

[request setDidFinishSelector:@selector(blahCommuniqueDone:)]; 
[request setDidFailSelector:@selector(blahCommuniqueDoneProblem:)]; 

(Soyez prudent avec les deux-points, aussi.) Oubliez d'essayer de les transmettre comme SELs. Les deux routines sont là dans le même objet. Vous pointez simplement vers eux.

Voici un exemple de travail complet typique. Si vous suivez cela, vous n'aurez aucun problème. Ces trois routines se trouvent juste dans le même fichier.

-(void) blahCommunique 
    { 
    // it sends the string blah for pid (even if blank) 
    // from V5 it sends the blah as well .. 

    NSURL *url = [NSURL URLWithString:@"https://blah?blah"]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 

    [request setPostValue:blahAA forKey:@"blahAA"]; 
    [request setPostValue:blahBB forKey:@"blahBB"];// new in V5 

    [request setPostValue:SIMPLESTRINGTHISVERSION forKey:@"version"]; 

#define QQ(a) [NSString stringWithFormat:@"%d", a] 

    [request setPostValue:QQ(vfourblahCount) forKey:@"cr"]; 
    [request setPostValue:QQ(vfourblahCount) forKey:@"sb"]; 
    [request setPostValue:QQ(vfourblahCount) forKey:@"so"]; 
    [request setPostValue:QQ(vfourblahCount) forKey:@"lc"]; 
    [request setPostValue:QQ(OLDlaunchCount) forKey:@"olc"]; 

#undef QQ 

    [request setPostValue:[[NSLocale preferredLanguages] objectAtIndex:0] forKey:@"langpref"]; 

    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(statsCommuniqueDone:)]; 
    [request setDidFailSelector:@selector(statsCommuniqueDoneProblem:)]; 

    [request startAsynchronous]; 
    } 

-(void) statsCommuniqueDone:(ASIHTTPRequest *)request 
    { 
    NSData *newStringData = [request responseData];//todo, check [incomingFloatData length] 

    self.factoryMessageIfAny = 
     [[[NSString alloc] initWithData:newStringData encoding:NSUTF8StringEncoding] autorelease]; 

    if ([self.factoryMessageIfAny isEqualToString:@"OK"]) 
     self.factoryMessageIfAny = @""; 
    } 
-(void) statsCommuniqueDoneProblem:(ASIHTTPRequest *)request 
    { 
    // statsCommuniqueDoneProblem ... ! 
    self.factoryMessageIfAny = @""; 
    }