Objective-C中的多个NSURLConnection委托
我有两个NSURLConnections。 第二个取决于第一个的内容,因此处理从连接接收的数据对于两个连接是不同的。
我只是拿起Objective-C,我想知道实现代表的正确方法是什么。
现在我正在使用:
NSURL *url=[NSURL URLWithString:feedURL]; NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease]; NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];
我不想用自己作为委托,我如何定义与不同委托的两个连接?
NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1]; NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];
我将如何创buildhandle1和handle2作为实现? 还是接口? 我真的不知道你会怎么做。
任何帮助都是极好的。
谢谢,Brian Gianforcaro
在你的示例中,你不需要启动它就可以分配一个DownloadDelegate对象。
DownloadDelegate * dd = [DownloadDelegate alloc];
这很危险 代替:
DownloadDelegate * dd = [[DownloadDelegate alloc] init];
另外,在@interface声明中声明你的委托响应方法并不是必须的(尽pipe它当然不会受到伤害)。 最后,你要确保你实现了连接:didFailWithError:和connectionDidFinishLoading:释放你的DownloadDelegate对象,否则你会泄漏。
很高兴你正在运行!
本 ,虽然你的信息是有帮助的没有完全回答我问的问题。
我终于想出了如何设置我自己的代表,这正是我真正要问的。
我像这样实现它:
@interface DownloadDelegate : NSObject - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; @end @implementation DownloadDelegate - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { } @end
我们使用这样的代表:
DownloadDelegate *dd = [DownloadDelegate alloc]; NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd];
希望能帮助任何处于同一位置的人,并再次感谢Ben的帮助。
谢谢,
布赖恩Gianforcaro
我认为以一种干净的方式处理多个连接的最好方法是保持一个委托,并用一个标签来标识每个NSURLConnection(这是一个非常简单的子类,你可以从http://www.isignmeout.com / multiple-nsurlconnections-viewcontroller / )
基本上可以用一个标识符来初始化每一个NSURLConnection,然后你可以在代理中取出这个标签,并且使用Switch-Case根据你需要的任何逻辑来处理它。
UPDATE
我已经把子类NSURLConnection变成了一个简单的类别 – 更简单,更简洁
代表被实现为标准的NSObject下降对象。
您可以将这两个连接指向同一个代理。
代表应该实现你想要捕获的NSURLConnectionDelegate方法(比如-connection:didReceiveData:和-connectionDidFinishLoading :)。 这些方法将被适当的委托调用。
尝试我的MultipleDownload类在http://github.com/leonho/iphone-libs/tree/master ,它为您处理多个NSURLConnection对象。
由于代表被asynchronous调用,他们可以按随机顺序调用didfinishloading。 您可以使用状态检查来确定“其他”下载是否完成,然后再继续。
我使用2个代表:
例如(这是伪oc):
jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)] otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]
当每个委托完成时,委托通知调用者,通过调用2完成方法。
每个完成的方法接收url数据,并将其状态保存为ivar。 然后他们检查是否已经设置了另一个伊娃,如果两者都完成,则继续处理。
if(self.jsonString && self.otherData){ continueProcessing }
希望这可以帮助。