如何在特殊类中设置HTTP连接?

时间:2009-03-10 02:19:20

标签: objective-c cocoa http class-design

我想创建一个类来处理其他类的所有HTTP连接工作(以避免重复编写代码)。 我将其称为ConnectionCenter(NSObject的子类)并将以下代码添加到其中:

-(void)connect:(NSString *)strURL obj:(ConnectCenter *)objConnect
{
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:objConnect];
    if (theConnection) 
    {
        // receivedData is declared as a method instance elsewhere
        receivedData = [[NSMutableData data] retain];
    } 
    else 
    { 
        // inform the user that the download could not be made
    }

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // append the new data to the receivedData
    // receivedData is declared as a method instance elsewhere
    [receivedData appendData:data];
}

其他类通过传递URL和ConnectionCenter的对象来调用它。但是没有调用ConnectionCenter中的方法'didReceiveData'。关于它有什么问题的任何想法?

2 个答案:

答案 0 :(得分:2)

设置连接后,您需要致电[theConnection setDelegate:self],因为connection:didReceiveData:是委托方法。

阅读documentation了解详情。

答案 1 :(得分:0)

关于此代码的一些事情......

首先,令人困惑的是您实际上将哪个对象设置为委托。对连接的调用:didReceiveData:将在连接的委托上调用,该委托是您传递给connect:obj:方法的任何对象。在ConnectionCenter上有一个实例方法,可以启动与另一个ConnectionCenter对象的连接作为委托,这似乎很奇怪。确保你正在查看右边对象的连接:didReceiveData:方法。

如果您没有收到任何数据,则可能是您的连接无法连接或只是完成而未返回任何数据。您应该实现connectionDidFinishLoading:和connection:didFailWithError:委托方法,这样您就可以知道连接是否已经完成,无论是否返回数据。

最后,你有一个竞争条件,如果你得到一个良好,快速的连接,你会咬你。 NSURLConnection对象将在您创建后立即开始运行。如果有任何数据要读取它将调用connection:didReceiveData:并且你将它附加到receivedData。但是如果连接速度足够快,您可能最终会尝试将数据附加到尚未创建的receivedData。这是一个很小的机会,但即使NSURLConnection的init方法没有阻止,在返回之前做出连接的工作量做出任何假设也是不明智的。在开始连接之前创建receivedData,这样您就可以确保在数据进入时放置数据。