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

Objective c 如何在特殊类中设置HTTP连接?,objective-c,cocoa,http,class-design,Objective C,Cocoa,Http,Class Design,我想创建一个类来处理其他类的所有HTTP连接工作(以避免重复编写代码)。 我将其称为ConnectionCenter(NSObject的子类),并向其添加以下代码: -(void)connect:(NSString *)strURL obj:(ConnectCenter *)objConnect { NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL]

我想创建一个类来处理其他类的所有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”。有什么问题吗?

您需要在设置连接后调用
[connection setDelegate:self]
,因为
connection:didReceiveData:
是一种委托方法


有关更多信息,请阅读。

关于此代码的一些内容

首先,它混淆了您实际设置为委托的对象。对connection:didReceiveData:的调用将在连接的委托上调用,委托是传递给connect:obj:方法的任何对象。在ConnectionCenter上有一个实例方法,可以用另一个ConnectionCenter对象作为委托启动连接,这似乎很奇怪。确保您正在查看正确对象上的connection:didReceiveData:方法

如果您没有收到任何数据,则可能是您的连接失败或只是在未返回任何数据的情况下完成。您应该实现connectionDiFinishLoading:和connection:didFailWithError:委托方法,这样您就可以知道连接是否已完成,是否返回数据


最后,如果你获得了一个好的、快速的连接,你的比赛条件会对你不利。NSURLConnection对象将在创建后立即开始运行。如果有任何数据要读取,将调用connection:didReceiveData:并将其附加到receivedData。但是如果连接足够快,您可能会尝试将数据附加到尚未创建的receivedData。这是一个很小的机会,但即使NSURLConnection的init方法没有阻塞,在返回之前对连接的运行工作量进行任何假设都是不明智的。在启动连接之前创建receivedData,这样您就可以确保在数据进入时有一个放置数据的位置。

为什么此connect:method在其第二个参数中接受ConnectionCenter?这不是一种连接中心的方法吗?如果是这样的话,为什么要将对象传递给它自己,而它可以用正常的方式(
self
)引用它自己?我做了这个更改,因为正常的方式“self”不起作用。如果这个还是不行,我就换回去。谢谢。我将代理改回“self”,它就可以工作了。谢谢。我将委托更改为“self”,它可以工作。上次可能是连接错误。