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)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top