Question

Je ne fais que commencer avec Objective C et Restkit

J'ai créé un exemple d'application et ajouté le RKRequestDelegate dans le fichier MyAppDelegate

@interface MyAppDelegate : NSObject <UIApplicationDelegate, RKRequestDelegate> {…

et ajouté

  RKClient* client = [RKClient clientWithBaseURL:@"http://localhost:3000"]; 
   NSLog(@"I am your RKClient singleton : %@", [RKClient sharedClient]);
   [client get:@"/titles.json" delegate:self];

à MyAppDelegate.m dans le

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method

J'ai également ajouté une méthode à MyAppDelegate.m

- (void) request: (RKRequest *) request didLoadResponse: (RKResponse *) response {
    if ([request isGET]) {        
        NSLog (@"Retrieved : %@", [response bodyAsString]);
    }
 }

Jusqu'ici tout va bien, tout fonctionne et je vois les résultats de mon application Rails dans la sortie !!!

Comme ces éléments n'appartiennent pas à MyAppDelegate.m, je les déplace dans mes modèles. Dans mes Titles.h j'ai ajouté

@interface Titles : NSManagedObject <RKRequestDelegate> {

et dans Titles.m j'ai ajouté

+ (void) update {   
    [[RKClient sharedClient] get:@"/titles.json" delegate:self];
}

et

- (void) request: (RKRequest *) request didLoadResponse: (RKResponse *) response {
    if ([request isGET]) {
        NSLog (@"Retrieved : %@", [response bodyAsString]);
    }
}

Dans mon MyAppDelegate.m j'ai remplacé:

 RKClient* client = [RKClient clientWithBaseURL:@"http://localhost:3000"]; 
   NSLog(@"I am your RKClient singleton : %@", [RKClient sharedClient]);
   [client get:@"/titles.json" delegate:self];

avec

  RKClient* client = [RKClient clientWithBaseURL:@"http://localhost:3000"]; 
   NSLog(@"I am your RKClient singleton : %@", [RKClient sharedClient]);
  [Titles update];

quand je cours maintenant, je n'obtiens aucune sortie. J'ai mis plusieurs points d'arrêt, un dans le - (void)didFinishLoad:(RKResponse*)response dans le fichier RKRequest et là le test if pour:

if ([_delegate respondsToSelector:@selector(request:didLoadResponse:)]) {
        [_delegate request:self didLoadResponse:finalResponse];
    }

échoue lors de ma première tentative (lorsque tout est dans MyAppDelegate)

J'ai vérifié la variable _delate dans le débogueur et elle dit: _delegate= MyAppDelegate lors de ma première tentative et _delegate= Titles lors de ma deuxième tentative (les deux comme il se doit)

Pourquoi est-ce que respondsToSelector échoue? (le délégué est correct et la méthode existe dans Titles)

Était-ce utile?

La solution

Votre problème est que vous essayez de définir une classe comme délégué:

+ (void) update {   
  [[RKClient sharedClient] get:@"/titles.json" delegate:self];
}

self ici est la classe Titles.

Le rappel est (comme prévu), une méthode d'instance:

- (void) request: (RKRequest *) request didLoadResponse: (RKResponse *) response {
  if ([request isGET]) {
    NSLog (@"Retrieved : %@", [response bodyAsString]);
  }
}

Vous devriez avoir une sorte de classe de modèle "DataModel" (peut-être "SongList" ou tout ce qui a du sens).Il s'agit souvent d'un singleton, vous avez donc une instance +sharedModel.Cette instance est le délégué pour RKClient.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top