2011-09-09 23 views
3

我剛開始接觸目標C和Restkit代表不工作(Restkit有關?)

我創建了一個示例應用程序,並添加了RKRequestDelegate在MyAppDelegate文件

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method 
到MyAppDelegate.m

我還添加了一個方法來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*)response在RKRequest文件 ,那邊如果測試:

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

,而它在我的第一次嘗試成功失敗(當一切都在MyAppDelegate)

我檢查調試器中的變量_delate和它說:_delegate = MyAppDelegate在我的第一次嘗試和_delegate =在我第二次嘗試的標題(都喜歡它應該)

爲什麼該respondsToSelector失敗? (委託是正確的,方法在標題中存在)

回答

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的代表是什麼。

+1

非常感謝羅布,我做了一點 測試通過使'更新'實例方法和創建一個對象 標題*標題= [標題分配]; [標題更新]; ,它的工作原理。 但是我不明白你對DataModel類的解釋。你能否詳細說明。我的課堂標題是NSManagedObject(使用核心數據),它將存儲不同相冊的所有標題。我使用類方法的原因是,像我在測試中那樣製作一個對象是愚蠢而不是好設計。 – Glenn

+0

這是一個奇怪的設計。爲什麼你有一個特殊的NSManagedObject包含其他對象的屬性?這似乎與Core Data有關。我想你會有一個'Collection'或'AlbumCollection'來容納'Album'對象。然後你可以使用'[collection allTitles]'返回標題,如果你需要它作爲一個字符串列表。 –

+0

我的解釋不是很明顯... 我有以下類:藝術家(屬性:名稱,stage_name,生日,...)和關係has_and_belongs_to_many專輯,專輯(屬性:名稱,年份,封面)has_many標題...所有這些都是NSManagedObjects。我希望他們每個人都有一個類方法更新,我會在應用程序的開始時調用它。該方法會將數據與Rails應用程序同步。 – Glenn