Delegar no funciona (¿Relabinado?)
-
28-10-2019 - |
Pregunta
Solo estoy comenzando con el objetivo C y el reposo
Creé una aplicación de muestra y agregué el RKRequestDelegate en el archivo myAppDelegate
@interface MyAppDelegate : NSObject <UIApplicationDelegate, RKRequestDelegate> {…
y agregado
RKClient* client = [RKClient clientWithBaseURL:@"http://localhost:3000"];
NSLog(@"I am your RKClient singleton : %@", [RKClient sharedClient]);
[client get:@"/titles.json" delegate:self];
a myappdelegate.m en el
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method
También agregué un método a myappdelegate.m
- (void) request: (RKRequest *) request didLoadResponse: (RKResponse *) response {
if ([request isGET]) {
NSLog (@"Retrieved : %@", [response bodyAsString]);
}
}
¡Hasta ahora todo bien todo está funcionando y veo los resultados de mi aplicación Rails en la salida!
Como esas cosas no pertenecen a MyAppDelegate.M, estoy moviendo esas cosas a mis modelos. En mis títulos. ¿Agregué
@interface Titles : NSManagedObject <RKRequestDelegate> {
y en títulos.m agregué
+ (void) update {
[[RKClient sharedClient] get:@"/titles.json" delegate:self];
}
y
- (void) request: (RKRequest *) request didLoadResponse: (RKResponse *) response {
if ([request isGET]) {
NSLog (@"Retrieved : %@", [response bodyAsString]);
}
}
En mi myappdelegate.m reemplazé:
RKClient* client = [RKClient clientWithBaseURL:@"http://localhost:3000"];
NSLog(@"I am your RKClient singleton : %@", [RKClient sharedClient]);
[client get:@"/titles.json" delegate:self];
con
RKClient* client = [RKClient clientWithBaseURL:@"http://localhost:3000"];
NSLog(@"I am your RKClient singleton : %@", [RKClient sharedClient]);
[Titles update];
Cuando ejecuto ahora no obtengo ninguna salida. Puse varios puntos de descanso, uno en el - (void)didFinishLoad:(RKResponse*)response
en el archivo rkRequest y allí la prueba if para:
if ([_delegate respondsToSelector:@selector(request:didLoadResponse:)]) {
[_delegate request:self didLoadResponse:finalResponse];
}
falla mientras tiene éxito en mi primer intento (cuando todo está en myappdelegate)
Verifiqué la variable _delate en De Debugger y dice: _delegate = myAppDelegate en mi primer intento y títulos _Delegate = en mi segundo intento (ambos como deberían)
¿Por qué fallan eso responde el estoselector? (El delegado es correcto y el método existe en títulos)
Solución
Su problema es que estás tratando de establecer una clase como delegado:
+ (void) update {
[[RKClient sharedClient] get:@"/titles.json" delegate:self];
}
self
aquí está el clase Titles
.
La devolución de llamada es (como se esperaba), un método de instancia:
- (void) request: (RKRequest *) request didLoadResponse: (RKResponse *) response {
if ([request isGET]) {
NSLog (@"Retrieved : %@", [response bodyAsString]);
}
}
Debería tener algún tipo de clase de modelo "DataModel" (tal vez "Lista de canciones" o lo que tenga sentido). Esto a menudo es un singleton, por lo que tienes un +sharedModel
instancia. Esa instancia es para qué es el delegado RKClient
.