在obj-c中进行非自我委托

时间:2011-04-22 00:28:58

标签: objective-c cocoa macos

为了在目标c中使用异步http请求,您需要将委托设置为NSURLConnection。问题是我需要发出多个http请求,所以拥有相同的委托(自己)不会工作。

最好的方法是什么?我应该为每个http请求创建一个新的委托类吗?这些代表只是NSObjects吗?

4 个答案:

答案 0 :(得分:5)

您有几个选择。最常见的两个是:

  • 为每个连接创建一个新类(是的,NSObject的子类)并将它们设置为委托 - 让它们执行加载数据时所需的任何逻辑

    < / LI>
  • 将一个类设置为委托,并存储对所有NSURLConnection的引用。这样,当您的代理人被- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data调用时,您可以测试正在使用的NSURLConnection(例如if ([connection == myConnection]) - 或者您正在实施的任何代理方法)

答案 1 :(得分:1)

答案 2 :(得分:1)

我所做的是创建一个处理下载文件的类,并在通过选择器完成时通知我。我传递了一个委托,一个选择器和执行下载所需的信息。

- (void) downloadFileFrom:(NSString*) httpLocation respondAt:(SEL)selector on:(id)target withParam:(id)param
{
    self.finishSelector = selector;
    self.delegate = target;
    self.responseParams = param;
}

Class是它自己的NSURLConnection委托。因此,实例与我可能实例化的其他实例分开,并且它处理创建自己的结果以供我使用。我抓住了param对象。这可能是任何事情。

在下载结束时,它会在委托上执行performSelector :.将自己传递给代表。

if ([self.target respondsToSelector:self.selector])
{
    [self.target performSelector:self.selector withObject:self.param];
}

然后你可以创建一个下载器的实例并调用你的方法...告诉它在哪里回复你。

MyDownloader downloader = [[MyDownloader alloc] init];
[downloader downloadFileFrom:@"http://www.mydomain.com/myimage" respondAt:@selector(myFileIsComplete:) on:self withParam: downloader];
[downloader autorelease];

另一种选择是为您的类创建一个@protocol来响应,并让您委派符合响应者。

答案 3 :(得分:0)

这应该有效,但还有另一种选择。您可以创建一个创建并调用NSURLConnection的通用类,只要它们足够通用即可。然后保留NSArrayNSDictionary个类。每个连接一个。

示例:我有一个需要同时下载多张照片的应用。因此,我有一个GetFlickrPhoto课程。它有一个自定义的init方法,可以接收URL和任何其他必要的信息。每个单独的类都会创建NSURLConnection,并可以安全地将委托设置为self

这有助于保持内容并且易于管理/重用。

更进一步:

我之前提到的应用程序,也需要下载JSON提要。所以我创建了一个GenericDownload类,它接受了URL并异步下载了NSData,然后通过定义的成功/失败协议将NSData返回给调用委托。它并不关心NSData包含的内容。

我重新设计GetFlickrPhoto以致电GenericDownload并使用返回的NSData来拍照。然后我创建了一个名为GetJSON的{​​{1}}类,并将返回的GenericDownload解析为JSON提要。

需要更多时间,但最终你会对维护和未来的项目感到高兴。

相关问题