3

我刚刚开始使用 Objective C 和 Restkit

我创建了一个示例应用程序并在 MyAppDelegate 文件中添加了 RKRequestDelegate

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

并添加

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

到 MyAppDelegate.m 中

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

我还向 MyAppDelegate.m 添加了一个方法

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

到目前为止一切正常,我在输出中看到了我的 Rails 应用程序的结果!!!

由于这些东西不属于 MyAppDelegate.m 我正在将这些东西移到我的模型中。在我的 Titles.h 中,我添加了

@interface Titles : NSManagedObject <RKRequestDelegate> {

在 Titles.m 中我添加了

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

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

在我的 MyAppDelegate.m 中,我替换了:

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

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

当我现在运行时,我没有得到任何输出。我放了几个断点,一个在- (void)didFinishLoad:(RKResponse*)responseRKRequest 文件中,并且在那里进行 if 测试:

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

在我第一次尝试成功时失败(当一切都在 MyAppDelegate 中时)

我在调试器中检查了变量 _delate,它说: _delegate = MyAppDelegate 在我的第一次尝试中和 _delegate = Titles 在我的第二次尝试中(两者都应该如此)

为什么 respondsToSelector 失败?(委托正确且方法存在于Titles中)

4

1 回答 1

4

您的问题是您尝试将类设置为委托:

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

self这里是 Titles

回调(如预期的那样)是一个实例方法:

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

您应该有某种“DataModel”模型类(可能是“SongList”或任何有意义的东西)。这通常是一个单例,所以你有一个+sharedModel实例。该实例是什么是委托RKClient

于 2011-09-09T17:44:13.183 回答