我想创建一个类来处理其他类的所有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'。关于它有什么问题的任何想法?
答案 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,这样您就可以确保在数据进入时放置数据。