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];

今実行すると、出力が得られません。いくつかのブレークポイントを配置しました。1 つ- (void)didFinishLoad:(RKResponse*)responseは RKRequest ファイル内にあり、そこには if テストがあります。

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

最初の試行で成功している間は失敗します (すべてが MyAppDelegate にある場合)

デバッガーで変数 _delate を確認したところ、最初の試行では _delegate = MyAppDelegate 、2 回目の試行では _delegate = Titles と表示されました (両方ともそうあるべきです)。

RespondsToSelector が失敗するのはなぜですか? (デリゲートは正しく、メソッドはタイトルに存在します)

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 に答える