2010-09-03 24 views
1

我有我自己的類,它應該執行請求和數據處理(解析)。這個類應該從不同的視圖控制器中使用。在這個類中,我實現了:ASIHTTPRequest:使用異步請求時,結果沒有在正確的時間填充

- (void)sendRequest:(NSString *)url; 
- (void)requestFinished:(ASIHTTPRequest *)request; 
- (void)requestFailed:(ASIHTTPRequest *)request; 
- (id)parse:(NSString *)aString; 

我創建了一個名爲result的屬性。如果請求到達,requestFinished被調用。在requestFinished結果保存在結果中。我想如果我在sendRequest中返回一個值,我會返回結果。但正如我之前提到requestFinished獲取結果,所以sendRequest總是返回一個零變量,因爲那時請求沒有完成。

我該怎麼做才能返回結果?我希望這個類可以在不同的視圖控制器中使用。所以我的第一個想法是在我的視圖控制器中創建一個方法並傳遞結果不起作用。

我讀了這個線程Pass Result of ASIHTTPRequest "requestFinished" Back to Originating Method關於使用視圖控制器作爲委託。但後來我認爲我必須在視圖控制器中實現requestFinished和requestFailed。沒有在不同視圖控制器中重複代碼的想法將消失...

有人可以幫忙嗎?

回答

0

所以最後我做了一個委託。

在我的抽象類(* .h)中,我定義如下,否則,你得到

警告:沒有「-setDarkness:」方法找到

警告:(消息沒有匹配的方法簽名會假設

警告:返回「身份證」,接受「..」作爲參數)

@protocol RssParserDelegate <NSObject> 
    - (void)displayResults:(NSDictionary *)parserResults; 
@end 

比我宣佈一個實例變量和一些。在我的抽象類的方法(* .h)中:

id _delegate; 
// ... 
- (id)delegate; 
- (void)setDelegate:(id)new_delegate; 

因此,聲明如下(* .M):

- (id)delegate { 
    return _delegate; 
} 

- (void)setDelegate:(id)new_delegate { 
    _delegate = new_delegate; 
} 

傳給你不得不穿上requestFailed下面的代碼的結果, requestFinished:

if ([_delegate respondsToSelector:@selector(displayResults:)]) 
    [_delegate displayResults:results]; 
else 
{ 
    [NSException raise:NSInternalInconsistencyException 
       format:@"Delegate doesn't respond to displayResults:"]; 
} 

我重新sendRequest將和輸入委託設置爲我的實例變量:

- (void)sendRequest:(NSString *)url withDelegate:(id)aDelegate { 
    // set delegate to populate the results later 
    [self setDelegate:aDelegate]; 

在您的視圖控制器聲明此方法:

- (void)displayResults:(NSDictionary *)results { 
    // do some data processing 
    ... 
    // show data 
    [self.tableView reloadData]; 
} 

而且我也改變了方法調用sendRequest將我的抽象類:

[yourRequest sendRequest:@"xxx" withDelegate:self]; 
+0

爲什麼不讓'_delegate'符合你的協議 - 就像'id _delegate'一樣,那麼你可以確定它響應'displayResults'而不需要檢查。 – cjroebuck 2011-01-28 12:56:09

+0

好點!不需要'respondsToSelector'。 – testing 2011-01-30 20:05:27

0

無論何時獲得結果並讓您的viewcontrollers將自己添加爲此通知的偵聽器(通過[通知對象]接收它),發佈觀察者通知)。

+0

於是我找到了解決辦法,但我不知道如何實現觀察者模式。也許你可以提供一個鏈接到一個教程或類似的東西。 – testing 2010-09-03 12:02:32

相關問題