2010-02-04 125 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