2010-02-04 52 views
1

如果這是一個基本問題,我很抱歉。我一直在谷歌搜索,搜索StackOverflow,並查看示例代碼幾個小時,並沒有發現任何滿意的我的技能水平。需要iPhone網絡連接的設計模式/示例鏈接

我想要的東西就像處理iPhone SDK上的網絡功能的設計模式。我聽說過使用單例類的人,但聽說有更好的異步連接方法。 NSOperation會有用嗎?我對面向對象編程相當陌生,但需要通過HTTP爲我的當前應用程序偶爾調用Web服務器,並希望找到一個易於重用的解決方案。

我已經看過NSURLConnection文檔,可以獲得基本的功能,但編程結構很混亂,我不確定如何更好地組織它。有沒有示例代碼將這些功能分離到他們自己的類中?鏈接到這樣做的例子將不勝感激! 謝謝!

回答

1

一種可能的方法是使用NSURLConnection(如您所述)。

內,您的.h文件中:

NSMutableData *connectionData; 

還添加了connectionData屬性...

裏面的.m文件:

- (void)updateFromServer { 
    // You might want to display a loading indication here... 

    NSMutableData *connectionDataTemp = [[NSMutableData alloc] init]; 
    self.connectionData = connectionDataTemp; 
    [connectionDataTemp release]; 

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL: your_url]; 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    [connection release]; 
    [request release]; 
} 

#pragma mark - 
#pragma mark NSURLConnectionDelegate 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Add the received bulk of data to your mutable data object 
    [self.connectionData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Use your data 

    // If there is a loading indication displayed then this is a good place to hide it... 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    // Handle error 

    // If there is a loading indication displayed then this is a good place to hide it... 
} 
+0

感謝您的回覆。這最好放在我的AppDelegate或視圖控制器?或者我應該有一個連接類,並在需要時在每個視圖控制器類中實例化它? – feesta 2010-02-05 02:19:14

+0

這取決於你的需求。如果你只在一個視圖控制器中使用它,那麼我肯定會把它放在那裏。我不會將這個功能放在應用程序委託中(我儘量避免將它用作代碼容器)。如果你使用來自許多視圖控制器的連接事物,你可以將它放置在某個外部類中,但通常,回調中的代碼對於調用它的視圖來說是私有的,因此使用它可能會非常棘手(可能會用showLoading,hideLoading,dataReceived等方法實現你自己的協議)。 – 2010-02-05 16:29:59

+0

另一種可能的方法是實現一個基本視圖控制器,它將實現所有這些方法(某些默認實現),並且您將覆蓋每個具體視圖控制器中的實現... – 2010-02-05 16:31:36

1

我一直在處理這個現在同樣的問題...

  1. 如果你有效地做一個簡單的資源獲取,並且您確信該資源將永遠在那裏&訪問,有一個簡單的方法來做到這一點:這是一個非常簡單的方法

    NSURL *URL=[[NSURL alloc] initWithString:@"http://www.google.com/"l]; 
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
    //TODO This needs to have timeouts & such set up, maybe parallelism 
    NSString *results = [[NSString alloc] initWithContentsOfURL :URL]; 
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 
    

    要做到這一點,但正如我的評論所說,不是很健壯或可靠。

    results = [[NSString alloc] initWithContentsOfURL:URL encoding:NSASCIIStringEncoding error:&err]; // possibly NSUnicodeStringEncoding 
    if (err!=nil) NSLog(@"Error occurred: %@", [err localizedDescription]); 
    

    至少會告訴你,如果有一個錯誤......

  2. ASIHTTPRequest提供:

  3. 稍微更穩健,但仍然相當簡單,與更換的NSString線很多整潔的&用於通過互聯網處理資源的有用網絡功能。 http://allseeing-i.com/ASIHTTPRequest/ - 開發者對他的Google羣組非常敏感。我真的很想使用它,並且可以在/如果它支持SSL客戶端證書身份驗證(這是我的項目要求)時回覆它。

  4. NSURLConnection,如上所述 - 這就是我現在在我的項目中使用的。我會想象,這將滿足幾乎所有的需求,但它(在我看來)使用更棘手。說實話,圍繞如何將異步數據加載到我的應用程序中,我仍然在思考一些問題。但是,如果它能爲你工作 - 而且很可能會,Apple會在操作系統和應用程序中使用它 - 這是你最好的選擇!

+0

使用initWithContentsOfURL時需要注意的一件事是,確實創建一個單獨的線程。因此,如果網絡連接速度較慢,那麼在方法調用期間,您的應用程序可能無響應。 – Brian 2010-12-01 15:18:46