15

我有两个 NSURLConnections。第二个取决于第一个的内容,因此对于两个连接,处理从连接接收到的数据将是不同的。

我刚刚开始学习Objective-C,我想知道实现代表的正确方法是什么。

现在我正在使用:

NSURL *url=[NSURL URLWithString:feedURL];
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];

我不想使用 self 作为委托,如何定义具有不同委托的两个连接?

NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];

我将如何创建 handle1 和 handle2 作为实现?还是接口?我真的不明白你会怎么做。

任何帮助都是极好的。

谢谢,布赖恩·吉安福卡罗

4

6 回答 6

14

Ben,虽然您的信息很有帮助,但它并没有完全回答我提出的问题。

我终于想出了如何设置我自己的代表,这正是我真正要问的。

我是这样实现的:

@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的帮助。

谢谢,

布赖恩·吉安福卡罗

于 2008-10-15T20:52:14.663 回答
10

我认为以干净的方式处理多个连接的最佳方法是保留一个委托并仅使用标签标识每个 NSURLConnection (这是一个非常简单的子类,您可以从http://www.isignmeout.com阅读和复制/multiple-nsurlconnections-viewcontroller/ )

基本上用一个识别标签初始化每个 NSURLConnection ,然后你可以在委托中拉那个标签,并使用 Switch-Case 根据你需要的任何逻辑处理它。

更新

我已经将子类 NSURLConnection 变成了一个简单的 Category - 更简单和更干净

https://github.com/Shein/Categories

于 2010-10-25T09:18:04.840 回答
4

在您的示例中,您分配了一个 DownloadDelegate 对象,而无需对其进行初始化。

    DownloadDelegate *dd = [DownloadDelegate alloc];

这是危险的。反而:

    DownloadDelegate *dd = [[DownloadDelegate alloc] init];

此外,在您的 @interface 声明中声明您的委托响应方法并不是绝对必要的(尽管它当然不会受到伤害)。最后,你要确保你实现了 connection:didFailWithError: 和 connectionDidFinishLoading: 来释放你的 DownloadDelegate 对象,否则你会泄漏。

很高兴你能跑起来!

于 2008-10-16T03:07:50.660 回答
3

委托被实现为标准的 NSObject-descended 对象。

您可以将两个连接指向同一个委托。

委托应实现您想要捕获的 NSURLConnectionDelegate 方法(例如 -connection:didReceiveData: 和 -connectionDidFinishLoading:)。这些方法将由委托适当地调用。

于 2008-10-15T00:43:12.373 回答
1

在http://github.com/leonho/iphone-libs/tree/master尝试我的 MultipleDownload 类,它为您处理多个 NSURLConnection 对象。

于 2008-11-12T18:44:26.223 回答
0

由于委托是异步调用的,他们可以随机调用 didfinishloading。然后,您可以使用状态检查来确定“其他”下载是否已完成,然后再继续。

我使用 2 个代表:

例如(这是伪 oc):

jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)]
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]

当每个委托完成时,委托通过调用 2 个 done 方法通知调用者。

每个 done 方法接收 url 数据,并将其状态保存到 ivar。然后他们检查是否设置了另一个 ivar,如果两者都完成,则继续处理。

if(self.jsonString && self.otherData){
  continueProcessing
}

希望这可以帮助。

于 2009-12-03T23:02:03.373 回答