需要iPhone网络连接的设计模式/示例链接

时间:2010-02-04 23:57:27

标签: iphone design-patterns

如果这是一个基本问题,我很抱歉。我一直在谷歌搜索,搜索StackOverflow,并查看示例代码几个小时,并没有找到任何满意的技能水平。

我想要在iPhone SDK上处理网络功能的设计模式。我听说有人使用单例类,但听说有更好的异步连接方法。 NSOperation会有用吗?我是面向对象编程的新手,但我需要通过HTTP为我当前的应用程序偶尔调用我的网络服务器,并希望找到一个易于重用的解决方案。

我查看了NSURLConnection文档并且可以获得基本功能,但编程结构很混乱,我不知道如何更好地组织它。是否有示例代码将这些函数分离到自己的类中?这样做的链接将非常感谢! 谢谢!

2 个答案:

答案 0 :(得分: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...
}

答案 1 :(得分:1)

我一直在讨论同样的问题......

  1. 如果您在一个简单的资源上有效地进行GET,并且您确信该资源将始终存在并且可以轻松获得:

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

    这是一个非常简单的方法,但正如我的评论所说,不是非常强大或可靠。

  2. 稍微更健壮,但仍然相当简单的是用以下内容替换NSString系列:

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

    如果出现错误,至少会告诉你......

  3. ASIHTTPRequest提供了很多整洁的功能。用于处理互联网资源的有用网络功能。 http://allseeing-i.com/ASIHTTPRequest/ - 开发人员对他的Google群组反响敏捷。我真的很想使用它,如果它支持SSL客户端证书身份验证(这是我的项目需要的话),可能会回复它。

  4. NSURLConnection,如上所述 - 这就是我现在在项目中使用的内容。我想这会满足几乎所有的需求,但是(在我看来)使用起来比较棘手。说实话,我仍然在解决如何将异步数据加载到我的应用程序中时遇到一些麻烦。但如果它对您有用 - 而且可能会,Apple会在操作系统及其应用程序中使用它 - 这是您最好的选择!