Le délégué ne fonctionne pas (lié à Restkit?)
-
28-10-2019 - |
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)
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
.