2011-05-05 65 views
3

我在開發一個iPhone應用程序庫的同時正在面臨設計決策,對此我很感激反饋。基本上,我正在爲REST API開發一個異步HTTP客戶端庫。異步iOS網絡庫設計

我的問題是: 將解析的數據從庫返回給調用代碼的推薦方法是什麼?

同步方式將簡單地: 的NSArray *用戶= [restLibrary getAllUsers] 其中getAllUsers被聲明爲: - (NSArray的*)getAllUsers;

或對於自定義對象 用戶*湯姆= [restLibrary的getUser:@ 「湯姆」] 如果的getUser:被聲明爲: - (用戶*)的getUser:(的NSString *)用戶名;

我很困惑如何幹淨地異步做到這一點。

我碰到這個unanswered question具有相同的確切問題。原始海報發現了一個解決方案,但他/她不確定是否是推薦的解決方案。

感謝您的幫助。

Jorge

回答

9

當使用異步調用時,您等待回調。這基本上意味着你要求一個班級開始做某件事,當它完成時,它應該執行你選擇的一種方法。

一個很好的例子是蘋果自己的NSUrlConnection類。你提供這個類與一個委託。這基本上是NSUrlConnection類將根據需要執行方法的一個對象。

所以

NSURLRequest * req = [NSURLRequest requestWithURL: self.url]; 
self.downloadConnection = [NSURLConnection connectionWithRequest: req 
                 delegate: self]; 
[self.downloadConnection start]; 

這告訴NSURLConnection的類來獲取在self.url數據,它應該使用當前類作爲代表。

上有代表的幾種方法,在某些情況下叫,最常見的一個很可能是

- (void) connectionDidFinishLoading: (NSURLConnection *) connection 
{ 

} 

對於你的類,你會做同樣的事情。您將首先定義一個@protocol來表示您將使用的接口。在你的榜樣,這可能有一個像

- (void)userFetched:(User *)user 

你然後用類似的方法執行你的restLibrary的方法來

[restLibrary getUser:@"tom" delegate:self] 

和主叫類實現userFetched方法。

在restLibrary的getUser方法中,您將執行實際的調用來獲取數據(很可能是使用NSUrlConnection,並將返回的數據解析爲User對象),然後調用userFetched和結果。

您需要實現其他方法來處理錯誤條件等。

這有幫助嗎?

+0

是的!,謝謝。我完全忽略了@protocol定義。事情現在有道理。再次感謝。 – jlmendezbonini 2011-05-05 16:59:07