2013-04-01 1 views
0

J'essaie d'utiliser une classe API pour récupérer des données à partir d'une URL, puis les renvoyer à une méthode dans ViewController. J'ai appelé ViewController la méthode API. J'ai déjà essayé plusieurs endroits sur SO et j'ai trouvé ce qui suit, mais cela ne fonctionne pas et comme un objectif Objective-C a essayé de lire la documentation et ainsi de suite, mais ne comprend toujours pas ce qui pourrait mal se passer.Problème Objective-C avec connectionDidFinishLoading et Delegate

J'ai un viewcontroller appelant une méthode 'fetch' dans une classe 'api'.
J'ai les délégués de connexion à l'intérieur de la classe api et cela fonctionne bien (les données correctes sont imprimées à l'intérieur de la méthode connectionDidFinishLoading).
J'ai besoin d'un délégué pour renvoyer les données à une méthode dans la classe viewcontroller.

Jusqu'à présent, j'ai

ViewController.h

#import "Api.h" 

@interface ViewController : UIViewController <apiDelegate>{ 

} 

- (void)apiSucceeded:(NSString *)jsonString; 
- (void)apiFailed:(NSString *)failedMessage; 

@end 

ViewController.m

#import "ViewController.h" 
#import "Api.h" 

- (void)apiSucceeded:(NSString *)jsonString { 
    NSLog(@"WORKED"); 
} 
- (void)apiFailed:(NSString *)failedMessage { 
    NSLog(@"FAILED"); 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    Api* myapi = [[Api alloc]init]; 
    [myapi fetch]; 
} 
@end 

api.h

@protocol apiDelegate 
@required 
- (void)apiSucceeded:(NSString *)jsonString; 
- (void)apiFailed:(NSString *)failedMessage; 
@end 


@interface Api : NSObject { 
    id _delegate; 

} 
@property (nonatomic, assign) id _delegate; 

-(void)fetch; 
@end 

Api.m

#import "Api.h" 
#import "ViewController.h" 

@synthesize _delegate; 

- (void)fetch{ 

//connection setup.... 
[NSURLConnection connectionWithRequest:[request autorelease] delegate:self]; 

} 


-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [self.receivedData setLength: 0]; 
} 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // NSLog(@"append data"); 
    [self.receivedData appendData:data]; 
    // NSLog(@"Bytes: %d", [receivedData length]); 
} 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    //TODO error handling for connection 
    if ([_delegate respondsToSelector:@selector(apiFailed:)]) { 
     [_delegate apiFailed:[error localizedDescription]]; 
    } 
    NSLog(@"Cannot Connect"); 
} 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"DONE. Received Bytes: %d", [self.receivedData length]); 

    NSString *jsonString = [[NSString alloc] initWithBytes: [receivedData mutableBytes] length:[receivedData length] encoding:NSUTF8StringEncoding]; 


    if ([_delegate respondsToSelector:@selector(apiSucceeded:)]) { 
     [_delegate apiSucceeded:jsonString]; 
    } 

} 

@end 

Il n'y a pas d'erreur, mais il ne tout simplement pas fonctionner méthode 'apiSucceeded'.
S'il vous plaît ne pas mal comprendre cela comme une question concernant 'connectionDidFinishLoading'. Ce bit fonctionne bien, c'est la remise des données BACK à un ViewController qui cause des problèmes.

Quelqu'un peut-il voir ce que j'ai mal fait s'il vous plaît?

Répondre

2

Je semble que vous avez oublié de mettre

myapi.delegate = self; 

après

Api* myapi = [[Api alloc]init]; 
+0

TRAVAILLEES .... JE VOUS AIME :) –

+0

@CraigTaub: Notez qu'un meilleur choix pour le nom de la propriété est ' delegate' sans le caractère de soulignement (et y accède via 'self.delegate'). L'instruction @synthesize et la variable d'instance sont créées automatiquement par les versions du compilateur en cours. –

+0

ah je vois. très appréciée. –

Questions connexes